PHPは連想配列を値で検索します。 PHP: array_search - 配列内のクイック検索。 多次元配列内の値の検索

23.10.2023

(PHP 4 >= 4.0.5、PHP 5)

array_search -- 検索を実行します。 与えられた値配列に格納し、成功した場合は対応するキーを返します。

説明

混合された 配列検索(混合針、干し草の配列 [, bool strict])

干し草の山から針の値を検索し、キーが配列内に存在する場合はキーを返します。 間違いさもないと。

コメント:針が文字列の場合、大文字と小文字を区別した比較が実行されます。

コメント: PHP 4.2.0までは、 配列検索()失敗した場合は返却される NULLの代わりに 間違い .

値を渡す場合 真実 strict のオプションの 3 番目のパラメータとして、関数 配列検索()また、干し草の山の配列内の針のタイプもチェックします。

干し草の山に針が複数回存在する場合は、最初に見つかったキーが返されます。 見つかったすべての値のキーを返すには、関数を使用します。 配列キー()オプションの search_value パラメーターを使用します。


例1:使用例 配列検索()

$array = array(0 => "青" , 1 => "赤" , 2 => 0x000000 , 3 => "緑" , 4 => "赤" );$key = array_search ("赤" , $配列 ); // $key = 1;
$key = array_search("green" , $array ); // $key = 2; (0x000000 == 0 == "緑")
$key = array_search ("green" , $array , true ); // $key = 3;
?>
注意

この関数はブール値として返すことができます 間違い、にキャストされる非ブール値 間違い、たとえば 0 または ""。 さらに詳しく 詳細情報ブール型のセクションを参照してください。 === 演算子を使用して、この関数によって返される値を確認します。

配列内の値の検索は、データを扱うほぼすべての PHP アプリケーションおよびスクリプトで必要であり、そのためのメソッドや特別な関数が多数あります。 タスクと検索の種類に応じて、その機能、実行速度、使いやすさを考慮して、特定のツールを使用する必要があります。 次に知りましょう PHP関数配列内の要素、可能な構造とメソッドを検索し、どのメソッドが最も速いかを調べます。

配列内で検索する関数:
配列検索- 配列内の値を検索するために使用されます。 成功した場合は、検索された値のキーを返します。何も見つからなかった場合は、FALSE を返します。 PHP 4.2.0 より前では、array_search() は失敗時に FALSE ではなく NULL を返しました。

関数mixed array_search (mixed needle, array haystack [, bool strict])の構文。

foreach ($value としての配列式)
声明
foreach ($key => $value としての配列式)
声明

foreach 構造を含む関数を使用して配列要素を検索し、成功した場合に TRUE を返す例

構築構文
一方 (式)
声明

成功すると配列要素のキーを返します。

測定値の表から、関数が次のとおりであることがわかります。 配列検索、小さい配列と大きい配列の両方で検索した場合に最良の結果が表示されます。 同時に、ループを使用した検索時間は、配列のサイズに応じて大幅に増加します。

コードを記述するときに、特定の要素の値が配列内に存在するかどうかを確認する必要があることがよくあります。 今日は、これを実行できるいくつかの関数を見ていきます。

配列内の要素値の存在を確認することは、さまざまなプログラミングの問題を解決するために使用できます。

データベースからさまざまな配列を取得し、その中に特定の値が存在するかどうかを確認できます。 たとえば、何かを探しているときに、スクリプトのユーザーから目的の値を送信することもできます。 このような検索の結果に基づいて、特定のアクションを実行できます。 すべては実行中の特定のタスクによって異なりますが、配列内の値を検索するアルゴリズムは同じです。

今日はそれらを見ていきます。

配列内の値の存在を確認します。 in_array() 関数

関数 in_array()これにより、配列内の値の存在を確認できるようになります。

作業の結果が成功し、配列内で目的の要素が見つかった場合、関数は戻り値を返します。 真実つまり「真実」です。

この関数は 2 つの必須パラメータを取ります。<Что ищем>そして<Где ищем>.

もう 1 つオプションのパラメータを受け入れることもできます。<Тип данных>。 この 3 番目のオプションのパラメータが次のように設定されている場合、 真実の場合、データ型もチェックされます。 つまり、「2」と 2 は同じものではありません。 最初の場合は文字列、2 番目の場合は数値です。 そして関数全体 in_array()値を返しません 真実.

また、この関数は大文字と小文字を区別して比較を実行することにも注意してください。

簡単な例を使用して、この関数がどのように機能するかを見てみましょう。
何らかの配列が必要です。 関数を使用して、配列内の値の存在を確認し、画面に表示します。 特定のメッセージ.

実行後、要素「Marina」が配列内に存在するため、関数はメッセージ「Yes」を表示します。

関数の最初のパラメータを存在しない要素に変更すると、「いいえ」というメッセージが表示されます。

配列内の値の存在を確認します。 array_search() 関数

別の検索機能があります 配列検索()、前のものとは異なり、見つかった要素のキーを返します。 これは、連想配列を使用する場合に便利です。

この関数は、前の関数と同じパラメータを受け取ります。 この場合、3 番目のパラメータもオプションです。

連想配列を操作するときにどのように使用できるかを見てみましょう。

"10月","お金"=>200,"名前"=>"ミラ"); $key = array_search("ミラ",$Mass1); if($key) echo $key; ?>

この場合、画面上に「名前」、つまり値「Mila」を持つ目的の要素へのキーが表示されます。

これら 2 つの関数は非常に似ており、基本的には戻り値のみが異なります。

多次元配列内の値の検索

しかし、多次元配列を扱う場合はどうなるでしょうか? 結局のところ、その要素は他の配列になります。

ここでは、すでに説明したアルゴリズムは機能しません。

実際にはそれほど複雑ではありません。メカニズム全体を少し複雑にしてループを使用するだけです。たとえば、 foreach()、配列でうまく機能します。

多次元配列があるとします。 その即値は、要素の必要な値を含む可能性のある他の配列です。

元の配列の要素をループするだけです。 foreach()。 この配列の各要素はキー ($key) と値 ($value) に解析されます。

値は、メインの多次元配列内にある各配列になります。 これらの値を操作して、各内部配列内で目的の要素値を検索します。

見つかった場合は、そのような要素が存在することを示すメッセージが表示され、見つからなかった場合は、そのような要素が存在しないことを示す別のメッセージが表示されます。

コード例でこれらすべてを見てみましょう:

"アンナ","id"=>234); $Mass2 = array("名前"=>"アントン","id"=>24); $Mass2 = array("name"=>"ivan","id"=>007); foreach($Mass2 as $key => $value) ( $name .= in_array("ivan",$value); ) if($name) echo "OK! 要素はここにあります!"; else echo "要素がありません!"; ?>

ご覧のとおり、最初に多次元配列自体を宣言します。

また、ここでは等号だけではなく「.=」を書く必要があります。

これは、$name 変数が反復ごとに上書きされずに補足されるようにするために行われます。 結局のところ、最初の反復で要素が見つかり、値「true」が $name 変数に書き込まれた場合でも、2 回目の反復では (つまり、2 番目の内部配列に) 要素の目的の値が存在しません。の場合、$name 変数の値は単純に上書きされ、最終的には正しい結果が得られなくなります。

ご存知のとおり、このコードの結果は「OK!」というメッセージになります。 エレメントはここにあります!

探している要素を存在しない要素に変更しようとすると、「No have element!」というメッセージが表示されます。

もちろん、特定の要素が見つかった場合でも見つからなかった場合でも、メッセージを表示するだけでなく、他のアクションを実行することもできます。 すべては何をする必要があるかによって決まります。 たとえば、必要な値が配列内にある場合、ユーザーに特定の情報などを提供できます。

今日はここまでです! レッスンがわかりやすくて役に立ったと思います! すべてを完全に理解するには、同様のコードを自分で書いてみてください。

そして、コメントもお待ちしています。

ソーシャルボタンを使用してレッスンを友達と共有します。 以下にあるネットワーク。 また、ブログの更新情報を購読してください。 私たちはすでに有用な資料のかなり優れたアーカイブを収集しており、それらは補充されるだけです。

プログラミングが成功することを祈っています!

アンナ・コテルニコワさんも一緒でした!

私は配列内の値を検索するためにかなり長い間 array_search() 関数を使用してきました。ループで配列を検索するよりも著しく高速に動作すると繰り返し聞いたり読んだりしてきたからですが、実際にはそうではありませんでした。どれだけ速いかが分かります。 ついに自分で調べて数えるようになりました。

この関数を使用した配列の検索速度と、foreach ループおよび while ループでの通常の配列の検索速度を比較してみました。 10 ~ 100 個の配列要素では、違いは目立たず、時間は無視できるほど短いです。 しかし、大規模な配列の場合、その違いは非常に重要であることが判明しました。 配列サイズが一桁大きくなるにつれて、検索時間も大幅に増加しました。 要素数が 10 万個になると、foreach の速度は 0.013 秒に低下し、一方、array_search() の速度も 0.017 秒に低下しましたが、依然として 0.004 秒と桁違いに高速でした。 大規模な配列を扱う大規模なスクリプトの場合、ループ内の検索を array_search() を使用した検索に置き換えることは、まったく「ノミの最適化」にはなりません。

この点で、私は職場の同僚の一人と最近、プログラマーはこれらすべての組み込み言語機能を知る必要があるのか​​、それとも「プログラマーの考え方」と一般知識で十分なのかについて議論したことを思い出しました。 この考え方そのものについては説明しませんが、関数について、すべての構文を詳細に理解する必要はないかもしれませんが、少なくともどのような関数があり、一般的にどのようなことができるのかを知る必要があると思います。

UPD: プログラマーの考え方も必要です。 記憶に気をつけていても問題はありません (ブレークとレンジからインスピレーションを受けています:)

ハックの下にあるのは、時間の計算に使用されたスクリプト コードです。

$mass=100000; // 検索する配列内の値の数
$検索=50000; // 配列内でこの値を探します
$first_result=array(); // 最初のオプションの平均値を計算する結果の配列
$second_result=array(); // 2 番目のオプションの平均値を計算する結果の配列
$ third_result=array(); // 3 番目のオプションの平均値を計算する結果の配列

// 配列を作成して埋める
$test_array = range(0, $mass-1); // SelenIT に感謝します))

/*
$test_array=array();
for ($i=0; $i<$mass; $i++)
{
$test_array=$i;
}
*/

// 平均値を計算するループ
for ($d=0; $d<30; $d++) {

//*************** array_search を使用して検索します *******************

// 時間のカウントを開始します
$time_start = マイクロタイム(1);
// 検索
$key = array_search($search, $test_array, true);
// 見つかった場合
if ($key!==FALSE) // 最初の要素の番号が 0 であるため、!= ではなく、!== が必要です。
{
エコー $test_array[$key];
}
$time_end = マイクロタイム(1);
// 時間計測の終了

// 値の配列に書き込みます
$first_result= $time_end - $time_start;

//*************** foreach ループで配列を検索します*******************

// 時間のカウントを開始します
$time_start = マイクロタイム(1);
// 検索自体
foreach ($test_array を $ta)
{
if ($ta==$search)
{
$ta をエコーし​​ます。
壊す;
}
}
$time_end = マイクロタイム(1);
// 時間計測の終了

// 値の配列に書き込みます
$second_result= $time_end - $time_start;

//*************** while ループで配列を検索 *******************

// 時間のカウントを開始します
$time_start = マイクロタイム(1);

// 配列の長さを決定します
$count=カウント($test_array);
$j=0;
// 検索自体
一方 ($j<$count)
{
if ($test_array[$j]==$search) // 見つかった場合
{
エコー $test_array[$j];
壊す;
}
$j++;
}
$time_end = マイクロタイム(1);
// 時間計測の終了

// 値の配列に書き込みます
$three_result= $time_end - $time_start;
}

$srednee1=array_sum($first_result)/count($first_result);
$srednee2=配列合計($秒結果)/カウント($秒結果);
$srednee3=array_sum ($third_result)/count($third_result);

Printf("最初のコードが平均で完了しました: %.7f 秒", $srednee1);
printf("2 番目のコードは平均で完了しました: %.7f 秒", $srednee2);
printf("3 番目のコードは平均で完了しました: %.7f 秒", $srednee3);

// 結果:
// 最初のコードの平均完了時間: 0.0000295 秒
// 平均で完了する 2 番目のコード: 0.0153386 秒
// 3 番目のコードの平均完了時間: 0.0226001 秒