PHP array_merge() 合併陣列
array_merge() 函數用來合併一個或多個陣列。
基本用法
<?php
$arr1 = [1, 2, 3];
$arr2 = [4, 5, 6];
$merged = array_merge($arr1, $arr2);
print_r($merged); // [1, 2, 3, 4, 5, 6]
?>
語法
array_merge(array ...$arrays): array
$arrays:要合併的陣列- 回傳值:合併後的新陣列
索引陣列合併
數字索引會被重新編號:
<?php
$arr1 = [0 => 'a', 1 => 'b'];
$arr2 = [0 => 'c', 1 => 'd'];
$merged = array_merge($arr1, $arr2);
print_r($merged);
// [0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd']
?>
關聯陣列合併
字串鍵會保留,相同的鍵會被後面的值覆蓋:
<?php
$arr1 = ['a' => 1, 'b' => 2];
$arr2 = ['b' => 3, 'c' => 4];
$merged = array_merge($arr1, $arr2);
print_r($merged);
// ['a' => 1, 'b' => 3, 'c' => 4]
// 注意:'b' 的值是 3,被 $arr2 覆蓋
?>
混合陣列
<?php
$arr1 = ['a' => 1, 0 => 'x'];
$arr2 = ['b' => 2, 0 => 'y'];
$merged = array_merge($arr1, $arr2);
print_r($merged);
// ['a' => 1, 0 => 'x', 'b' => 2, 1 => 'y']
// 數字鍵被重新編號,字串鍵保留
?>
合併多個陣列
<?php
$arr1 = [1, 2];
$arr2 = [3, 4];
$arr3 = [5, 6];
$merged = array_merge($arr1, $arr2, $arr3);
print_r($merged); // [1, 2, 3, 4, 5, 6]
?>
展開運算子(PHP 7.4+)
可以使用展開運算子 ... 替代 array_merge():
<?php
$arr1 = [1, 2, 3];
$arr2 = [4, 5, 6];
$merged = [...$arr1, ...$arr2];
print_r($merged); // [1, 2, 3, 4, 5, 6]
?>
注意:展開運算子只能用於索引陣列(PHP 8.1 之前)
<?php
// PHP 8.0 以下會報錯
// $arr1 = ['a' => 1];
// $merged = [...$arr1]; // Error
// PHP 8.1+ 支援關聯陣列展開
$arr1 = ['a' => 1, 'b' => 2];
$arr2 = ['c' => 3];
$merged = [...$arr1, ...$arr2]; // OK in PHP 8.1+
?>
array_merge() vs + 運算子
+ 運算子保留第一個陣列的值:
<?php
$arr1 = ['a' => 1, 'b' => 2];
$arr2 = ['b' => 3, 'c' => 4];
// array_merge:後面覆蓋前面
$merged1 = array_merge($arr1, $arr2);
print_r($merged1);
// ['a' => 1, 'b' => 3, 'c' => 4]
// + 運算子:前面保留,後面補充
$merged2 = $arr1 + $arr2;
print_r($merged2);
// ['a' => 1, 'b' => 2, 'c' => 4]
?>
array_merge_recursive()
遞迴合併,相同鍵的值會合併成陣列:
<?php
$arr1 = [
'name' => 'Alice',
'hobbies' => ['reading']
];
$arr2 = [
'name' => 'Bob',
'hobbies' => ['gaming']
];
$merged = array_merge_recursive($arr1, $arr2);
print_r($merged);
// [
// 'name' => ['Alice', 'Bob'],
// 'hobbies' => ['reading', 'gaming']
// ]
?>
常見應用
合併設定
<?php
$defaults = [
'host' => 'localhost',
'port' => 3306,
'charset' => 'utf8mb4'
];
$custom = [
'host' => 'db.example.com',
'username' => 'admin'
];
$config = array_merge($defaults, $custom);
print_r($config);
// [
// 'host' => 'db.example.com', // 被覆蓋
// 'port' => 3306,
// 'charset' => 'utf8mb4',
// 'username' => 'admin' // 新增
// ]
?>
收集結果
<?php
$allUsers = [];
// 從多個來源收集
$admins = getAdmins();
$editors = getEditors();
$members = getMembers();
$allUsers = array_merge($allUsers, $admins, $editors, $members);
?>
插入元素
<?php
$arr = [1, 2, 5, 6];
// 在位置 2 插入 3, 4
$before = array_slice($arr, 0, 2);
$after = array_slice($arr, 2);
$result = array_merge($before, [3, 4], $after);
print_r($result); // [1, 2, 3, 4, 5, 6]
?>
去除重複後合併
<?php
$arr1 = [1, 2, 3];
$arr2 = [3, 4, 5];
$merged = array_unique(array_merge($arr1, $arr2));
print_r($merged); // [1, 2, 3, 4, 5]
?>
條件性合併
<?php
$base = ['a' => 1, 'b' => 2];
$extra = [];
if ($condition1) {
$extra['c'] = 3;
}
if ($condition2) {
$extra['d'] = 4;
}
$result = array_merge($base, $extra);
?>
效能考量
<?php
// 迴圈中重複合併效能較差
$result = [];
foreach ($items as $item) {
$result = array_merge($result, $item); // 每次都建立新陣列
}
// 使用 array_push 或 [] 更好
$result = [];
foreach ($items as $item) {
foreach ($item as $value) {
$result[] = $value;
}
}
// 或一次合併
$result = array_merge(...$items);
?>
注意事項
<?php
// array_merge 回傳新陣列,不會修改原陣列
$arr1 = [1, 2];
$arr2 = [3, 4];
$merged = array_merge($arr1, $arr2);
print_r($arr1); // [1, 2](不變)
print_r($merged); // [1, 2, 3, 4]
// 傳入 null 會產生警告
// array_merge($arr1, null); // Warning
// 空陣列處理
$result = array_merge([], [1, 2], [], [3, 4]);
print_r($result); // [1, 2, 3, 4]
?>