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]
?>