| 特性 | array_merge() | + 運算符 |
|---|---|---|
| 數字鍵名 | 重新索引(0,1,2...) | 保留原鍵名,後者不覆蓋前者 |
| 字符串鍵名 | 後者覆蓋前者 | 前者優先,後者忽略 |
| 返回值 | 新數組 | 新數組 |
| 性能 | 稍慢(需重建索引) | 極快(僅鍵名查找) |
<?php
$r = [1, 2, 3, 4, 5, 6];
$e = [7, 8, 9, 10];
// 數字索引陣列
var_dump($r + $e); // [0=>1, 1=>2, 2=>3, 3=>4, 4=>5, 5=>6] 後者完全被忽略
var_dump(array_merge($r, $e)); // [0=>1, 1=>2, 2=>3, 3=>4, 4=>5, 5=>6, 6=>7, 7=>8, 8=>9, 9=>10]
// 關聯陣列(字符串鍵)
$a = ['x' => 1, 'y' => 2];
$b = ['y' => 20, 'z' => 30];
var_dump($a + $b); // ['x'=>1, 'y'=>2, 'z'=>30] 'y' 保留第一個
var_dump(array_merge($a, $b)); // ['x'=>1, 'y'=>20, 'z'=>30] 'y' 被覆蓋
// 混合鍵名
$m1 = [0 => 'a', 'k' => 'b'];
$m2 = [1 => 'c', 'k' => 'd'];
var_dump($m1 + $m2); // [0=>'a', 'k'=>'b', 1=>'c'] 數字鍵 1 保留,字符串鍵 k 保留第一個
var_dump(array_merge($m1, $m2)); // [0=>'a', 'k'=>'d', 1=>'c'] 重新索引數字鍵,字符串鍵覆蓋
array_merge 重置為連續索引;+ 保留原索引,衝突時**左邊優先**。array_merge **右邊覆蓋**左邊;+ **左邊優先**,右邊忽略。$default = ['debug' => false, 'limit' => 10];
$user = ['limit' => 20];
$config = $default + $user; // 正確:['debug'=>false, 'limit'=>10] ❌ 用戶配置被忽略!
$config = array_merge($default, $user); // 正確:['debug'=>false, 'limit'=>20] ✅
配置合並**必須用 array_merge**,確保用戶配置覆蓋默認值。
$a = ['db' => ['host' => 'localhost', 'port' => 3306]];
$b = ['db' => ['port' => 3307, 'charset' => 'utf8']];
array_merge($a, $b); // ['db' => ['port'=>3307, 'charset'=>'utf8']] host 丟失!
// 需遞歸合並
function array_merge_recursive_distinct(array &$a, array &$b) {
foreach ($b as $k => $v) {
if (is_array($v) && isset($a[$k]) && is_array($a[$k])) {
array_merge_recursive_distinct($a[$k], $v);
} else {
$a[$k] = $v;
}
}
}
+ 運算符為 O(n) 且不重建內存,array_merge 需分配新內存並複製。百萬級數組合並時,+ 快 5~10 倍。
...$merged = [...$a, ...$b]; // 等同 array_merge($a, $b),語法更簡潔
$merged = ['default' => true, ...$userConfig]; // 覆蓋模式,等同 array_merge(['default'=>true], $userConfig)
注意:解包運算符遇到字符串鍵衝突會拋出 Error(PHP 8.1+),需確保鍵名不衝突或用 array_merge。
| 場景 | 推薦方式 | 理由 |
|---|---|---|
| 配置文件合並(用戶覆蓋默認) | array_merge($default, $user) | 字符串鍵覆蓋語義正確 |
| 多個列表拼接(如分頁數據聚合) | array_merge 或 [...$a, ...$b] | 重新索引便於遍歷 |
| 註冊表/映射表合並(鍵唯一,先註冊優先) | $registry + $newEntries | 保留首次註冊,極快 |
| 大數組高性能合並 | + 或 array_merge + yield 生成器 | 避免內存峰值 |