Contents

php array_merge 與 array + array 的差別

php array_merge and array + array

如題,本篇探討 array_merge 與 array 相加的差異

測試

1
2
3
4
5
<?php
$a1 = [1, 2, 3];
$a2 = [4, 5, 6];
$result = array_merge($a1, $a2); // [1, 2, 3, 4, 5, 6]
$result = $a1 + $a2;             // [1, 2, 3]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
$a1 = [
  1,              // 0 => 1
  'a' => 7,
  2,              // 1 => 2
  'b' => 8,
];
$a2 = [
    'a' => 9,
    3,            // array_merge: 2 => 3    array相加: 0 => 3
    'b' => 10,
    'c' => 11,
    4,            // array_merge: 3 => 4    array相加: 1 => 4
    5,            // array_merge: 4 => 5    array相加: 2 => 5
];

$result = array_merge($a1, $a2);
/*
    0   => 1
    'a' => 9
    1   => 2
    'b' => 10
    2   => 3
    'c' => 11
    3   => 4
    4   => 5
*/
$result = $a1 + $a2;
/*
    0   => 1
    'a' => 7
    1   => 2
    'b' => 8
    'c' => 11
    2   => 5
*/

以下是依據自己測試過後的結果與參考網路資訊整理下來的 pseudocode

array_merge($arr1, $arr2, $arr3…)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
$result = array();
$index = 0;
依序從 $arr1, $arr2, $arr3... 的每個 item ($key => $value) 做拜訪 {
    if (item 沒有指定key值 ) {
        $key = $index;
        $index++;
    }
    $result[$key] = $value;
}

$arr1 + $arr2 + $arr3…

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
$result = array();
依序從 $arr1, $arr2, $arr3... 的每個 item ($key => $value) 做拜訪 {
    if (is first item of each array) {
        $index = 0;
    }

    if (item 沒有指定key值 ) {
        $key = $index;
        $index++;
    }

    if (!isset($result[$key])) {
        $result[$key] = $value;
    }
}

注意,這裡的 $index 是在每次拜訪一個新的陣列就歸零哦


結論

  • array_merge
    • 對有指定 key 值的 item,後者的 value 會覆蓋前者 (以後者為主)
    • 對沒指定 key 值的 item,則會以一全新的流水號(從0開始跑的 index counter)為其 key 值加到陣列中
    • 適合用於:絕大部份情況均適用,後者資料較重要的情況
  • array 相加
    • 對有指定 key 值的 item,前者的 value 會覆蓋後者 (以前者為主)
    • 對沒指定 key 值的 item,則會以一全新的流水號(從0開始跑的 index counter)為其 key 值加到陣列中,且每拜訪新的陣列,index counter 就會歸零
    • 適合用於:key 值含有特殊意義,如 user_id,此時用此法相當於合併兩 user list 並以 user_id 做好 unique 處理, 效率較佳

參考資料:

PHP Array 相加與 Array_merge