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でループします。