PHP in_array で要素の存在を確認する
in_array() は、指定した値が配列に含まれているかを調べる関数です。見つかれば true、見つからなければ false を返します。
$fruits = ['apple', 'banana', 'orange'];
var_dump(in_array('banana', $fruits)); // true
var_dump(in_array('grape', $fruits)); // false第 1 引数が検索する値、第 2 引数が対象の配列です。
厳密な比較
デフォルトでは緩やかな比較(==)が行われます。これは予期しない結果を招くことがあるため、第 3 引数に true を指定して厳密な比較(===)を使うのが推奨されます。
$values = [0, false, null, ''];
// 緩やかな比較(危険)
var_dump(in_array('hello', $values)); // true('hello' == 0 が true)
var_dump(in_array(0, $values)); // true
// 厳密な比較(安全)
var_dump(in_array('hello', $values, true)); // false
var_dump(in_array(0, $values, true)); // true0 == 'hello' が true になるのは PHP の型変換の仕様です。文字列が数値に変換される際、数値で始まらない文字列は 0 になります。この挙動は多くのバグの原因になるため、常に第 3 引数を true にする習慣をつけましょう。
連想配列での動作
in_array() は値だけを検索します。キーは検索対象になりません。
$user = ['name' => 'Alice', 'age' => 25];
var_dump(in_array('Alice', $user)); // true(値に存在)
var_dump(in_array('name', $user)); // false(キーは検索されない)キーの存在を確認したい場合は array_key_exists() または isset() を使います。
パフォーマンス
in_array() は線形探索(O(n))です。大きな配列で頻繁に検索する場合は、配列をキーに変換して isset() で調べる方が高速です。
// 遅い(毎回線形探索)
$list = ['apple', 'banana', 'orange', /* ... 大量のデータ */];
if (in_array($value, $list, true)) { /* ... */ }
// 速い(ハッシュテーブル参照)
$set = array_flip($list);
if (isset($set[$value])) { /* ... */ }