| 運算符 | 比較規則 | 適用場景 |
|---|---|---|
== | 鍵名不區分類型,值鬆散比較("1" == 1 為 true) | 業務邏輯允許類型轉換的鬆散比較 |
=== | 鍵名、值、順序、類型全嚴格一致 | 需要精確匹配,如配置校驗、緩存鍵比對 |
$a = ["apple", "banana"]; // [0=>"apple", 1=>"banana"] $b = [1 => "banana", "0" => "apple"]; // [1=>"banana", 0=>"apple"] var_dump($a == $b); // bool(true) 鍵名經類型轉換後相同,值相同 var_dump($a === $b); // bool(false) 順序不同($a 索引 0,1;$b 索引 1,0)
關鍵點:== 會將字符串鍵 "0" 轉為整數 0,導致看似不同的結構判定相等;=== 則要求索引順序完全一致。
遞歸應用上述規則:
$arr1 = ['k' => ['a' => 1]]; $arr2 = ['k' => ['a' => '1']]; var_dump($arr1 == $arr2); // true 值鬆散比較 var_dump($arr1 === $arr2); // false 子數組值類型不同
function arraysEqual($a, $b) {
return empty(array_diff($a, $b)) && empty(array_diff($b, $a));
}
// 注意:僅比較值,忽略鍵名;嚴格模式需用 array_diff_assoc
$a = ["a" => "apple", "b" => "banana"]; $b = ["a" => "pear", "c" => "cherry"]; $union = $a + $b; // ["a"=>"apple", "b"=>"banana", "c"=>"cherry"] 左優先 $merge = array_merge($a, $b); // ["a"=>"pear", "b"=>"banana", "c"=>"cherry"] 右覆蓋
$a = [1 => "x", 3 => "y"]; $b = [1 => "z", 2 => "w"]; $a + $b; // [1=>"x", 3=>"y", 2=>"w"] 保留原鍵,衝突不覆蓋 array_merge($a, $b); // [0=>"x", 1=>"y", 2=>"z", 3=>"w"] 重新連續索引
===,避免類型轉換導致的隱性 Bug。array_unique 或 array_flip 雙翻轉法(見文章 60044)。array_merge+array_merge / array_values