PHP合并数组

概述

php合并数组一般有三个方法

  1. 使用array_merge函数
  2. 使用array_merge_recursive函数
  3. 使用操作符+

对比差异

array_merge+的比较

  1. 对于字符串索引,array_merge以后面的数组为准,覆盖前面数组相应的值;+操作以前面的数组为准
  2. 对于数字索引,array_merge会同时保留所有数组的对应的值,并且把索引从0重排;+操作处理数字索引的策略和处理字符串索引一致:以前面的数组为准,且保留原索引

array_mergearray_merge_recursive的比较

  1. 对于相同的字符串索引,array_merge_recursive会把所有的值合并成一个数组,而array_merge会以后面的数组为准
  2. 对于数字索引,两者都会保留全部的值,并把索引从0重排

注意

  • array_merge只传入一个数组参数时,会把参数中的数组索引从0重排
  • array_merge_recursive对于相同的字符串索引,如果值仍是数组,则会对数组再次合并当做此索引的值

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$arr1 = [
2 => 'super',
1 => 'star',
'hello' => 'my world',
'arr' => [
3 => 'ha',
2 => 'ya',
'hello' => 'wa',
]
];
$arr2 = [
1 => 'lets',
2 => 'laugh',
'hello' => 'your world',
'arr' => [
'yes no'
]
];

print_r(array_merge($arr1, $arr2));

print_r($arr1 + $arr2);

print_r(array_merge_recursive($arr1, $arr2));

以上代码输出为:

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
47
Array
(
[0] => super
[1] => star
[hello] => your world
[arr] => Array
(
[0] => yes no
)

[2] => lets
[3] => laugh
)
Array
(
[2] => super
[1] => star
[hello] => my world
[arr] => Array
(
[3] => ha
[2] => ya
[hello] => wa
)

)
Array
(
[0] => super
[1] => star
[hello] => Array
(
[0] => my world
[1] => your world
)

[arr] => Array
(
[3] => ha
[2] => ya
[hello] => wa
[3] => yes no
)

[2] => lets
[3] => laugh
)

Bug

在7.0.20版本中,array_merge_recursive合并相同字符串索引的数组时,合并结果中会有相同的数字索引。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$arr1 = [
'arr' => [
3 => 'hello',
2 => 'world',
]
];
$arr2 = [
'arr' => [
'yes',
'no'
]
];

$result = array_merge_recursive($arr1, $arr2);

print_r($result);

以上代码会输出:

1
2
3
4
5
6
7
8
9
10
11
Array
(
[arr] => Array
(
[3] => hello
[2] => world
[2] => yes
[3] => no
)

)