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));       // true

0 == '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])) { /* ... */ }