in_array() 用於檢查指定值是否存在於陣列中,回傳布林值。語法如下:
bool in_array ( mixed $value, array $array [, bool $strict = FALSE ] )
true 為嚴格模式(型別與值皆需相同),false 為預設鬆散模式$arr = [1, 3, 5, 7, 9];
var_dump(in_array(1, $arr)); // true
var_dump(in_array('1', $arr)); // true(字串 '1' 自動轉型為整數)
$arr = [1, 3, 5, 7, 9];
var_dump(in_array('1', $arr, true)); // false(型別不同:string vs int)
var_dump(in_array(1, $arr, true)); // true
class A { public $val = 1; }
class B { public $val = 2; }
$a = new A();
$b = new B();
$c = clone $a; // 相同屬性值的獨立實例
$arr = [$a, $b];
var_dump(in_array($c, $arr, false)); // true(鬆散模式比較屬性值)
var_dump(in_array($c, $arr, true)); // false(嚴格模式比較物件實例身份)
關鍵差異:鬆散模式下比較物件屬性值;嚴格模式下比較是否為同一實例(===)。
$arr = [
[1, 2, 3, 4],
[5, 6, 7, 8, 9],
10
];
var_dump(in_array(10, $arr)); // true(第三層元素)
var_dump(in_array(10, $arr[1])); // false(第二層子陣列無 10)
var_dump(in_array([1,2,3,4], $arr)); // true(搜尋子陣列本身)
in_array() 為線性搜尋 O(n),頻繁查詢建議改用 isset($arr[$value]) 或 array_flip() 後鍵值查找 O(1)array_walk_recursive()// 陷阱 1:0、false、null 鬆散比較皆相等
in_array(0, ['apple', 'banana']); // true('apple' == 0 為 true)
in_array(false, ['apple', 'banana']); // true
in_array(null, ['apple', 'banana']); // true
// 解決:務必使用嚴格模式
in_array(0, ['apple', 'banana'], true); // false
// 陷阱 2:浮點數精度
in_array(0.1 + 0.2, [0.3]); // false(0.30000000000000004)
in_array(round(0.1 + 0.2, 1), [0.3]); // true