<?php
var_dump(array("a") + array("b")); // 輸出 array(1) { [0]=> string(1) "a" }
?>
array("a") 等價於 array(0 => "a")。+ 運算子合並規則:右側陣列中與左側鍵名相同的元素被忽略,左側值保留。0,故右側 "b" 被丟棄。$a = ['k' => 'a'];
$b = ['k' => 'b'];
var_dump($a + $b); // ['k' => 'a'] 左側勝出
var_dump($b + $a); // ['k' => 'b'] 順序互換,右側變左側,結果反轉
| 場景 | + 運算子 | array_merge() |
|---|---|---|
| 字串鍵名相同 | 左側保留,右側忽略 | 右側覆蓋左側 |
| 數字鍵名相同 | 左側保留,右側忽略 | 重新索引(0,1,2...)追加,不覆蓋 |
| 數字鍵名不同 | 保留原鍵名合並 | 重新索引追加 |
$a = [1 => 'A', 2 => 'B'];
$b = [4 => 'C', 1 => 'D'];
var_dump($a + $b);
// [1=>'A', 2=>'B', 4=>'C'] 鍵名 1 衝突,左側 'A' 勝出
var_dump(array_merge($a, $b));
// [0=>'A', 1=>'B', 2=>'C', 3=>'D'] 重新索引,'D' 追加在後
$arr = [
10, // 0 => 10
5 => 6, // 5 => 6
3 => 7, // 3 => 7
'a' => 4, // 'a' => 4
11, // 6 => 11 (最大整數鍵 5 → 下一個 6)
'8' => 2, // 8 => 2 (數值字串鍵自動轉整數)
'02' => 77, // '02' => 77 (非純數字字串保留字串鍵)
0 => 12, // 0 => 12 覆蓋最初的 10
];
var_dump($arr);
// 0 => 12, 3 => 7, 5 => 6, 6 => 11, 8 => 2, 'a' => 4, '02' => 77
結論:同一陣列字面量中,後出現的同名鍵覆蓋先前值(整數鍵與數值字串鍵視為同一鍵)。
array_merge($default, $user),讓用戶配置覆蓋預設值。+ 保留原鍵,或 array_replace()(行為同 + 但支援多陣列)。array_values(array_merge(...))。php -l 發現。