in_array(mixed $needle, array $haystack, bool $strict = false): bool
$os = ['Mac', 'NT', 'Irix', 'Linux'];
var_dump(in_array('Irix', $os)); // true
var_dump(in_array('mac', $os)); // false(大小寫敏感)
同時比較值與型別:
$a = ['1.10', 12.4, 1.13];
var_dump(in_array('12.4', $a, true)); // false(字串 vs 整數/浮點數)
var_dump(in_array(1.13, $a, true)); // true(同為 float)
$a = [['p', 'h'], ['p', 'r'], 'o']; var_dump(in_array(['p', 'h'], $a)); // true(陣列比較遞迴檢查)
| 場景 | in_array 效能 | 推薦替代 | 複雜度 |
|---|---|---|---|
| 陣列 < 50 元素 | 可接受 | in_array | O(n) |
| 陣列 > 1000 元素,頻繁查詢 | 慢(每次遍歷) | isset($map[$key]) | O(1) |
| 需檢查多個值是否存在 | 多次遍歷 | array_intersect | O(n) |
$largeArray = range(1, 100000);
$needles = [123, 456, 789];
// 慢:每次 O(n)
foreach ($needles as $n) {
in_array($n, $largeArray);
}
// 快:預先建立 hash map O(n),查詢 O(1)
$map = array_flip($largeArray); // [1=>0, 2=>1, ...]
foreach ($needles as $n) {
isset($map[$n]); // 極快
}
in_array(0.1 + 0.2, [0.3], true) 為 false(0.30000000000000004)。解決:比較前 round() 或用字串比較。in_array,務必先 array_flip 或 array_column 建立索引。$arr = [1, 2, 3]; array_is_list($arr); // true $arr2 = [0=>1, 2=>3]; // 非連續鍵 array_is_list($arr2); // false
配合 in_array 可先判斷陣列類型選擇最佳搜尋策略。
in_array。in_array 支援遞迴比較,但效能差,建議正規化資料結構。