PHP in_array() 預設使用鬆散比較(loose comparison),會自動進行型別轉換,導致許多非預期的匹配結果。本文透過實例揭示常見陷阱,並說明如何正確使用嚴格模式避免錯誤。
<?php
$a = array("1,2,3", "4");
// 案例 1:數字 1 匹配字串 "1,2,3"
var_dump(in_array(1, $a)); // true (非預期)
// 案例 2:字串 '1' 不匹配
var_dump(in_array('1', $a)); // false
// 案例 3:字串 'a' 不匹配 "a,2,3"
$b = array("a,2,3", "4");
var_dump(in_array('a', $b)); // false
"1,2,3" 轉數字變成 1(取開頭數字直到非數字字元)"a,2,3" 轉數字變成 0(非數字開頭)in_array(1, ["1,2,3"]) 實際比較 1 == 1 為 true<?php
$a = array(0, "m");
var_dump(in_array('mc6', $a)); // true! 因為 'mc6' 轉數字為 0
var_dump(in_array('abc', $a)); // true! 同理
任何非數字開頭的字串轉數字皆為 0,若陣列含整數 0,皆會匹配成功。
<?php
$a = array("1,2,3", "4");
var_dump(in_array(1, $a, true)); // false (嚴格模式)
var_dump(in_array('1', $a, true)); // false
var_dump(in_array("1,2,3", $a, true)); // true
第三個參數設為 true 啟用嚴格模式,同時檢查值與型別必須完全相同。
in_array($needle, $haystack, true)in_array((string)$id, $ids, true)array_flip() + isset() 提升效能| 函數 | 預設比較模式 | 支援嚴格模式 |
|---|---|---|
in_array() | 鬆散 | 是 (第3參數) |
array_search() | 鬆散 | 是 (第3參數) |
array_key_exists() | 嚴格 (鍵名) | 不適用 |
isset($arr[$key]) | 嚴格 | 不適用 |