array_merge 和 array+ 的区别

Version

PHP version 7.1.26

键名是string,两者区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$arr1 = ['a' => 'PHP'];
$arr2 = ['a' => 'PYTHON'];
print_r(array_merge($arr1, $arr2));
// Array ( [a] => PYTHON ) 如果键名为字符,且键名相同,array_merge()后面数组元素值会覆盖前面数组元素值
print_r($arr1 + $arr2);
// Array ( [a] => PHP )如果键名为字符,且键名相同,数组相加会将最先出现的值作为结果

//再比如
$arr1 = ['a' => '1', 'b' => '2'];
$arr2 = ['a' => '1', 'b' => '3', 'c' => '2'];
print_r(array_merge($arr1,$arr2));
// Array ( [a] => 1 [b] => 3 [c] => 2 )
print_r($arr1 + $arr2);
// Array ( [a] => 1 [b] => 2 [c] => 2 )

键名是数字,两者区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$arr1 = ['JAVA', 'PHP'];
$arr2 = ['PYTHON', 'PHP'];
print_r(array_merge($arr1, $arr2));
// Array ( [0] => JAVA [1] => PHP [2] => PYTHON [3] => PHP ) 如果键名为数字,array_merge()不会进行覆盖
print_r($arr1 + $arr2);
// Array ( [0] => JAVA [1] => PHP )如果键名为数字,数组相加会将最先出现的值作为结果,后面键名相同的会被抛弃

//再比如
$arr1 = [1 => '1', 2 => '2'];
$arr2 = [1 => '1', 2 => '3', 8 => '2'];
$ret = array_merge($arr1,$arr2);
print_r($ret);
// Array ( [0] => 1 [1] => 2 [2] => 1 [3] => 3 [4] => 2 ) 如果数组中的键名为数字时,会格式化键名并保留所有键值。
print_r($arr1 + $arr2);
// Array ( [1] => 1 [2] => 2 [8] => 2 ) 如果数组中的键名为数字时,数组相加会将最先出现的值作为结果,后面键名相同的会被抛弃

延伸

如何最有效的获取字符键名相同,值不同的两个数组值集合呢

1
2
3
4
$arr1 = ['a' => 'PHP', 'C'];
$arr2 = ['a' => 'JAVA', 'C', 'PYTHON'];
print_r(array_merge_recursive($arr1, $arr2));
// Array ( [a] => Array ( [0] => PHP [1] => JAVA ) [0] => C [1] => C [2] => PYTHON )