四大核心差異
| 特性 | + 運算子 | array_merge() | array_merge_recursive() |
| 數字索引處理 | 保留原索引,不重設 | 重設為 0 起始連續索引 | 重設為 0 起始連續索引 |
| 字串鍵衝突 | 前者優先,後者被忽略 | 後者覆蓋前者 | 合併為陣列(遞歸) |
| 多陣列合併 | 僅支援兩個 | 支援無限個參數 | 支援無限個參數 |
| 巢狀陣列 | 不處理(整體覆蓋/忽略) | 不處理(整體覆蓋) | 遞歸合併巢狀結構 |
實戰測試代碼
$arr1 = array(
10 => 'valueof10',
11 => 'valueof11',
'key1' => 'dataofkey1',
'key2' => 'dataofkey2',
'array' => array(
'key1' => 1,
'key2' => 'abc',
'key3' => array(1, 2, 'name' => 'peter')
)
);
$arr2 = array(
10 => 'newvalueof10',
11 => 'newvalueof11',
'key1' => 'newdataofkey1',
'key3' => 'newdataofkey3',
'array' => array(
'key1' => 2,
'key2' => 'defg',
'key3' => array(1, 2, 'name' => 'jonathan', 'gender' => 'male')
)
);
結果對比
1. $arr1 + $arr2
array(6) {
10 => 'valueof10' // 保留 arr1 的數字索引 10
11 => 'valueof11' // 保留 arr1 的數字索引 11
'key1' => 'dataofkey1' // 字串鍵衝突,arr1 優先
'key2' => 'dataofkey2'
'array' => array(...) // 整體保留 arr1 的巢狀陣列
'key3' => 'newdataofkey3' // arr2 獨有鍵被加入
}
2. array_merge($arr1, $arr2)
array(8) {
0 => 'valueof10' // 數字索引重設為 0,1,2...
1 => 'valueof11'
'key1' => 'newdataofkey1' // 字串鍵衝突,arr2 覆蓋
'key2' => 'dataofkey2'
'array' => array(...) // 巢狀陣列被 arr2 整體覆蓋
2 => 'newvalueof10' // arr2 的數字索引接在後面
3 => 'newvalueof11'
'key3' => 'newdataofkey3'
}
3. array_merge_recursive($arr1, $arr2)
array(7) {
'key1' => array('dataofkey1', 'newdataofkey1'), // 衝突鍵合併為陣列
'key2' => 'dataofkey2',
'array' => array(
'key1' => array(1, 2),
'key2' => array('abc', 'defg'),
'key3' => array(
array(1,2,'name'=>'peter'),
array(1,2,'name'=>'jonathan','gender'=>'male')
)
),
'key3' => 'newdataofkey3',
0 => 'valueof10', 1 => 'valueof11',
2 => 'newvalueof10', 3 => 'newvalueof11'
}
選擇建議
- 需保留數字索引、第一優先:用
+
- 需重設索引、後者優先:用
array_merge()
- 需保留衝突值、巢狀深度合併:用
array_merge_recursive()