$a1 = [1 => 'abc', 3 => 10]; $a2 = [1 => 'efg', 3 => 20]; print_r(array_merge($a1, $a2));
// 預期(字符串鍵行為) Array ( [1] => efg [3] => 20 ) // 實際輸出 Array ( [0] => abc [1] => 10 [2] => efg [3] => 20 )
「若輸入數組包含數字鍵名,後面的值不會覆蓋原值,而是附加到後面。若只給一個數字索引數組,鍵名將以連續方式重新索引。」
| 鍵類型 | array_merge 行為 | + 運算符行為 |
|---|---|---|
| 字符串鍵 | 後覆蓋前 | 左優先,不覆蓋 |
| 數字鍵 | 重新連續索引(0,1,2...),不覆蓋 | 保留原鍵,衝突左優先 |
$result = $a1 + $a2; // [1=>'abc', 3=>10] 左優先,不符合 // 正確做法:先反轉再合併再反轉,或遍歷覆蓋 $result = array_replace($a1, $a2); // [1=>'efg', 3=>20] 完美!
$merged = array_merge($a1, $a2); // 已是連續索引 // 或 $merged = array_values($a1 + $a2); // 先合併保留鍵,再重置索引
$arr = [5 => 'a', 8 => 'b']; $reindexed = array_merge($arr); // [0=>'a', 1=>'b'] 文檔明確支援單參數