陣列合併是 PHP 開發高頻操作。array_merge() 與 array_merge_recursive() 雖名稱相似,但對鍵名衝突、數值索引、多維陣列的處理截然不同。本文透過範例深度解析兩者差異與適用場景。
$fruits = ["apple", "banana", "pear"];
$numbers = ["1", "2", "3"];
$merged = array_merge($fruits, $numbers);
// 結果: ["apple", "banana", "pear", "1", "2", "3"]
// 數值索引重新排序 (0,1,2,3,4,5)
array_values())。$a = ["x" => 1, "y" => 2];
$b = ["y" => 99, "z" => 3];
print_r(array_merge($a, $b));
// 結果: ["x" => 1, "y" => 99, "z" => 3] // y 被覆蓋
$fruit1 = ["apple" => "red", "banana" => "yellow"];
$fruit2 = ["pear" => "yellow", "apple" => "green"];
$result = array_merge_recursive($fruit1, $fruit2);
// 結果:
// [
// "apple" => ["red", "green"],
// "banana" => "yellow",
// "pear" => "yellow"
// ]
array_merge(),重新排序。$a = ["config" => ["debug" => true, "env" => "dev"]];
$b = ["config" => ["debug" => false, "log" => "/var/log"]];
print_r(array_merge_recursive($a, $b));
// 結果:
// [
// "config" => [
// "debug" => [true, false],
// "env" => "dev",
// "log" => "/var/log"
// ]
// ]
| 特性 | array_merge() | array_merge_recursive() |
|---|---|---|
| 字串鍵衝突 | 後者覆蓋 | 合併為陣列 |
| 數值索引 | 重新排序 | 重新排序 |
| 多維陣列 | 僅第一層合併 | 遞歸合併所有層級 |
| 適用場景 | 配置覆蓋、列表拼接 | 資料聚合、多來源收集 |
+ 運算子 ($a + $b) ,鍵名不衝突時保留原索引,衝突時左邊優先 (不覆蓋)。symfony/polyfill 的 array_merge_recursive_distinct。array_merge 接受可變參數,一次傳入多個陣列比迴圈合併快。理解 array_merge (覆蓋) 與 array_merge_recursive (聚合) 的核心差異,能避免配置合併、資料匯總等常見邏輯錯誤。根據業務需求選擇正確函數,或組合 + 運算子實現更精確的合併語意。