在 PHP 開發中,陣列操作是最基礎也最常用的技能之一。其中陣列合併運算子 + 雖然語法簡單,但其行為特性常讓開發者踩坑。本文將透過實例深入解析 + 運算子的運作機制,並對比 array_merge() 的差異,助你精準掌握陣列合併的最佳實踐。
+ 運算子的核心邏輯是:將右側陣列中「不存在於左側陣列」的鍵值對,追加到左側陣列中。若鍵名重複,保留左側陣列的值,右側值被忽略。這與 array_merge()「後覆蓋前」的行為截然不同。
<?php
$arr1 = ['a' => '朝陽區', 'b' => '海澱區'];
$arr2 = ['h' => '西城區', 'a' => '東城區', 'b' => '豐台區'];
$result = $arr1 + $arr2;
print_r($result);
?>
輸出結果:
Array
(
[a] => 朝陽區 // 保留 $arr1 的值
[b] => 海澱區 // 保留 $arr1 的值
[h] => 西城區 // $arr1 無此鍵,新增
)
<?php
$arr1 = ['a' => '朝陽區', 'b' => '海澱區'];
$arr2 = ['h' => '西城區', 'a' => '東城區', 'b' => '豐台區'];
$result = $arr2 + $arr1; // 順序互換
print_r($result);
?>
輸出結果:
Array
(
[h] => 西城區
[a] => 東城區 // 保留 $arr2 的值
[b] => 豐台區 // 保留 $arr2 的值
)
+ vs array_merge()| 特性 | + 運算子 | array_merge() |
|---|---|---|
| 字串鍵名衝突 | 左側優先,右側忽略 | 右側覆蓋左側 |
| 數字索引處理 | 保留原索引,不重新編排 | 重新編排索引 (0,1,2...) |
| 適用場景 | 配置合併、預設值填充 | 列表拼接、資料聚合 |
<?php
$defaults = ['timeout' => 30, 'retry' => 3, 'ssl' => true];
$userConfig = ['timeout' => 60]; // 僅覆寫 timeout
$config = $userConfig + $defaults;
// 結果: timeout=60, retry=3, ssl=true
?>
<?php
$zhTW = ['welcome' => '歡迎', 'login' => '登入'];
$zhCN = ['welcome' => '欢迎']; // 缺少 login
$translations = $zhCN + $zhTW; // 缺漏自動回退到繁體
?>
[0=>'a'] + [1=>'b'] 結果為 [0=>'a', 1=>'b'],但 [0=>'a'] + [0=>'b'] 僅保留第一個TypeError+ 比 array_merge() 略快,因無需重建索引+,需要「資料合併覆蓋」用 array_merge()掌握 + 運算子的「左優先」特性,能讓你在處理設定合併、多語系回退、快取策略等場景時寫出更簡潔、高效的程式碼。記住:選對工具,事半功倍。