【PHP】陣列合併應用:array + array、array_merge()、array_replace()

【PHP】陣列合併應用:array + array、array_merge()、array_replace()

本篇重點

  • 陣列的自定義鍵值和流水號鍵值
  • array + array、array_merge()、array_replace() 的使用方式和差異

陣列的自定義鍵值和流水號鍵值

陣列的鍵值可以是自定義的字符串或整數,也可以是預設的流水號鍵值

自定義鍵值

使用有意義的鍵來標識陣列中的元素

1
2
3
4
5
$customArray = [
'name' => 'Alice',
'age' => 25,
'city' => 'New York'
];

流水號鍵值

從 0 開始遞增的整數鍵值。沒有指定鍵時,PHP 會自動生成預設的流水號鍵值

1
$defaultArray = ['Apple', 'Banana', 'Cherry'];

同時使用自定義鍵值和流水號鍵值

1
2
3
4
5
6
7
$mixedArray = [
'name' => 'Bob',
'age' => 30,
'colors' => ['Red', 'Green', 'Blue'],
'2' => 'two',
1 => 1
];

鍵值重複

同一個陣列中使用相同的鍵值,後面定義的值會覆蓋前面的值。

1
2
3
4
5
$duplicateArray = [
'name' => 'Bob',
'name' => 'Tom',
'age' => 30,
];

陣列合併應用

array + array

  • 保留第一組陣列的所有鍵值對
  • 添加第二組陣列中不在第一組陣列的鍵值對
  • 如果兩個陣列有相同的鍵值(不管字串或數字的鍵值),則保留第一組陣列的鍵值對
  • 如果合併的時候有流水號鍵值,則保持原順序,不會重新排序

範例

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
37
38
39
40
41
42
43
// 自定義鍵值
$array1 = ['a' => 1, 'b' => 2];
$array2 = ['b' => 3, 'c' => 4];
$result1 = $array1 + $array2;

// 輸出結果
print_r($result1);
Array
(
[a] => 1
[b] => 2
[c] => 4
)

// 流水號鍵值
$array3 = [0 => 'Apple', 3 => 'Banana'];
$array4 = [0 => 'Cherry', 2 => 'Grap'];
$result2 = $array3 + $array4;

// 輸出結果
print_r($result2);
Array
(
[0] => Apple
[3] => Banana
[2] => Grap
)

// 同時使用自定義鍵值和流水號鍵值
$array5 = [0 => 'Apple', 'b' => 23, 3 => 'Banana'];
$array6 = ['e' => 66, 'Cherry', 'Grap'];
$result3 = $array5 + $array6;

// 輸出結果
print_r($result3);
Array
(
[0] => Apple
['b'] => 23
[3] => Banana
['e'] => 66
[1] => Grap
)

array_merge()

  • 合併一組或多組陣列
  • 保留所有參與合併陣列的鍵值對
  • 如果有相同的鍵值 (不是數字的鍵值),後面陣列的鍵值對會覆蓋前面的鍵值對
  • 如果合併的時候有數字或流水號鍵值,則重新排序 (從0開始遞增)

範例

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
37
38
39
40
41
42
43
44
45
46
// 自定義鍵值
$array1 = ['a' => 1, 'b' => 2];
$array2 = ['b' => 3, 'c' => 4];
$result1 = array_merge($array1, $array2);

// 輸出結果
print_r($result1);
Array
(
[a] => 1
[b] => 3
[c] => 4
)

// 流水號鍵值
$array3 = [0 => 'Apple', 3 => 'Banana'];
$array4 = [0 => 'Cherry', 2 => 'Grap'];
$result2 = array_merge($array3, $array4);

// 輸出結果
// 陣列都是數字鍵值,合併後鍵值重新排序
print_r($result2);
Array
(
[0] => Apple
[1] => Banana
[2] => Cherry
[3] => Grap
)

// 同時使用自定義鍵值和流水號鍵值
$array5 = [0 => 'Apple', 'b' => 23, 3 => 'Banana'];
$array6 = ['e' => 66, 'Cherry', 'Grap'];
$result3 = array_merge($array5, $array6);

// 輸出結果
print_r($result3);
Array
(
[0] => Apple
[b] => 23
[1] => Banana
[e] => 66
[2] => Cherry
[3] => Grap
)

array_replace()

  • 合併一組或多組陣列
  • 添加後面陣列中不在第一組陣列的鍵值對
  • 如果有相同的鍵值 (不管字串或數字的鍵值),後面陣列的鍵值對會覆蓋前面的鍵值對
  • 如果合併的時候有流水號鍵值,則保持原順序,不會重新排序

範例

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
37
38
39
40
41
42
43
// 自定義鍵值
$array1 = ['a' => 1, 'b' => 2];
$array2 = ['b' => 3, 'c' => 4];
$result1 = array_replace($array1, $array2);

// 輸出結果
print_r($result1);
Array
(
[a] => 1
[b] => 3
[c] => 4
)

// 流水號鍵值
$array3 = [0 => 'Apple', 3 => 'Banana'];
$array4 = [0 => 'Cherry', 2 => 'Grap'];
$result2 = array_replace($array3, $array4);

// 輸出結果
print_r($result2);
Array
(
[0] => Cherry
[3] => Banana
[2] => Grap
)

// 同時使用自定義鍵值和流水號鍵值
$array5 = [0 => 'Apple', 'b' => 23, 3 => 'Banana'];
$array6 = ['e' => 66, 'Cherry', 'Grap'];
$result3 = array_replace($array5, $array6);

// 輸出結果
print_r($result3);
Array
(
[0] => Cherry
[b] => 23
[3] => Banana
[e] => 66
[1] => Grap
)

array + array、array_merge()、array_replace() 相互比較

合併組數

  • array + array:只能合併兩組陣列
1
$result = $array1 + $array2;
  • array_merge():可合併多組陣列
1
$result = array_merge($array1, $array2, $array3, ...);
  • array_replace():可合併多組陣列
1
$result = array_replace($array1, $array2, $array3, ...);

相同鍵值時,鍵值對的覆蓋方式

  • array + array
    • 不論是字符串鍵值還是數字鍵值,保留第一組陣列的鍵值對,不會被後面的鍵值對覆蓋
  • array_merge()
    • 字符串鍵值:後面陣列的鍵值對會覆蓋前面的鍵值對
    • 數字鍵值:後面陣列的值會追加到結果陣列中,不覆蓋前面的鍵值對
  • array_replace()
    • 不論是字符串鍵值還是數字鍵值,後面陣列的鍵值對都會覆蓋前面的鍵值對

合併數字鍵值時,鍵值排序方式

  • array + array:保持數字鍵值的原順序,不會重新排序
1
2
3
4
5
6
7
8
9
10
11
12
$array1 = [0 => 'Apple', 2 => 'Banana'];
$array2 = [2 => 'Cherry', 4 => 'Grap'];
$result = $array1 + $array2;

// 輸出結果:
print_r($result);
Array
(
[0] => Apple
[2] => Banana
[4] => Grap
)
  • array_merge():數字鍵值會重新索引,從0開始遞增
1
2
3
4
5
6
7
8
9
10
11
12
13
$array1 = [0 => 'Apple', 2 => 'Banana'];
$array2 = [2 => 'Cherry', 4 => 'Grap'];
$result = array_merge($array1, $array2);

// 輸出結果:
print_r($result);
Array
(
[0] => Apple
[1] => Banana
[2] => Cherry
[3] => Grap
)
  • array_replace():保持數字鍵值的原順序,不會重新排序
1
2
3
4
5
6
7
8
9
10
11
12
$array1 = [0 => 'Apple', 2 => 'Banana'];
$array2 = [2 => 'Cherry', 4 => 'Grap'];
$result = array_replace($array1, $array2);

// 輸出結果:
print_r($result);
Array
(
[0] => Apple
[2] => Cherry
[4] => Grap
)

總結

array + array array_merge() array_replace()
合併陣列組數 兩組 多組 多組
相同鍵值的覆蓋方式 不論字符串鍵值還是數字鍵值,保留第一組陣列的鍵值對,不覆蓋 字符串鍵值:後者覆蓋前者
數字鍵值:追加不覆蓋
不論字符串鍵值還是數字鍵值,後者覆蓋前者
合併數字鍵值時的排序方式 保持原順序,不重新排序 重新排序,從0開始遞增 保持原順序,不重新排序

array + array、array_merge()、array_replace() 三種合併陣列的方式,各自有相似的地方,但是執行結果有些許差異。

我很常會忘記它們各自的差異,所以需要陣列合併的時候會不知道要使用哪個方式,希望透過這篇整理可以幫助到我跟有同樣困擾的人😂

【PHP】陣列合併應用:array + array、array_merge()、array_replace()

https://forgetfulengineer.github.io/Backend/PHP/Analyzing-Three-Methods-of-Merging-Array/

作者

健忘工程師

發表於

2024-08-11

更新於

2024-08-11

許可協議


評論

複製完成