Menu

PHPのarray_search():値から配列のキーを検索する

array_search($value, $array)は、$valueと等しい最初の要素のキーを返し、なければfalseを返します。キーは0のこともあるので、結果は必ず!== falseで判定します。厳密な検索、すべての一致の取得、array_columnを使った多次元配列の検索、大文字小文字を区別しない検索を学びます。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

array_search($value, $array)は、$valueと等しい最初の要素のキーを返し、一致する要素がなければfalseを返します。見つかったキーが0のこともあるので、if (($key = array_search('pear', $fruits)) !== false)のように、結果は!== falseで判定します。

あるかないかだけが知りたいなら、in_array()が直接答えてくれます。array_search()は、たとえば値を変更したり削除したりするために、値がどこにあるかを知る必要があるときに使います。

0とfalseの落とし穴

array_search()でいちばんよくあるバグです。値が最初の要素でキーが0のとき、if ($key)は0をfalseとして扱います。値がすぐそこにあるのに、コードは「見つからない」と言うのです。本当のfalseにだけ一致する!== falseで比較しましょう。

0 == falseはtrueなので、!= falseにもif ($key)と同じバグがあります。両者を区別できるのは厳密な演算子だけです。

厳密な検索

in_array()と同じく、array_search()も第三引数にtrueを渡さない限り==で比較します。ゆるいモードでは文字列が数値に一致し、nullが0に一致するので、予想外のキーが返ってきます。

値に一致するすべてのキーを探す

array_search()は最初の一致で止まります。array_keys($array, $value)は一致するすべてのキーを配列で返し、trueを足せば厳密な比較になります。一致がなければ空の結果になるので、0とfalseの混同は起きません。

array_columnで多次元配列を検索する

array_search()はネストした配列の中までは見ません。行のリストなら、検索するフィールドをarray_column()で取り出します。そのリストの位置は行番号と一致するので、結果がそのまま行の添字になります。

array_column()は出力に0から番号を振り直すので、行が欠番なく0, 1, 2と番号付けされているときしか対応がとれません。unset()やarray_filter()のあとは番号に欠番ができるので、先に行にarray_values()を実行するか、最後の2行のようにキー付きの検索を使います。インデックスキーの形についてはarray_column()で詳しく説明しています。

大文字小文字を区別しない検索

array_search()は文字列を正確に比較します。大文字小文字を無視するには両辺を小文字にします。array_map()はキーを保つので、返ってくるキーは元の配列のキーです。

検索して置き換える、または削除する

検索するいちばんの理由は、見つけた要素を操作することです。キーがわかれば、代入して変更するかunset()で削除します。その前に必ず!== falseで確認してください。unset($arr[false])はキーが0の要素を黙って削除してしまいます。

よくある質問

値が見つからないとき、array_searchは何を返しますか?

falseです。見つかったときはキーを返しますが、それが0や空文字列のこともあるので、結果はif ($key)や!= falseではなく、必ず!== falseで確認します。

最初の要素でarray_searchの判定が失敗するのはなぜですか?

インデックス配列の最初の要素のキーは0で、0はfalseと評価されます。そのためif (array_search('a', ['a', 'b']))は見つからなかった側の分岐に進みます。if (array_search('a', $arr) !== false)と書きましょう。

PHPで値に対応するすべてのキーを見つけるには?

array_search()は最初の一致で止まります。array_keys($array, $value, true)は、値が一致するすべてのキーを配列で返します(なければ空の配列)。

PHPで多次元配列を検索するには?

フィールドを平らなリストに取り出して、それを検索します:$i = array_search('ada@example.com', array_column($users, 'email'));。そのあと$users[$i]で行を読みます。これは行が0, 1, 2と番号付けされているときに使えます。そうでなければforeachでループします。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める