What's the difference between array_merge and array + array?
一个相当简单的问题。有什么区别:
1 |
和
1 | $merged = $array1 + $array2; |
?
下面是一个简单的说明性测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $ar1 = [ 0 => '1-0', 'a' => '1-a', 'b' => '1-b' ]; $ar2 = [ 0 => '2-0', 1 => '2-1', 'b' => '2-b', 'c' => '2-c' ]; print_r($ar1+$ar2); print_r(array_merge($ar1,$ar2)); |
结果是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
请注意,重复的非数字键将使用union运算符获取第一个值,而后面的一个使用array_merge。
对于数字键,第一个值将与union运算符一起使用,而所有值将与数组合并一起使用,只是重新编制了索引。
我通常对关联数组使用联合运算符,对数字使用数组合并。当然,您也可以使用数组合并进行关联,只是后面的值会覆盖前面的值。
区别在于:
+符号只从数组键的第一次出现中获取值。数组合并从数组键的最后一次出现中获取值。
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | $first = ['a'=>'one', 'b'=>'two', 'c'=>'three']; $second = ['a'=>'fourth', 'b'=>'fifth', 'c'=>'sixth', '3'=>'number three']; $merged = $first + $second; echo"[cc lang="php"] plus sign merge "; var_dump($merged); $merged = array_merge($first,$second); echo" array_merge function merge "; var_dump($merged); |
此输出:
plus sign merge
array(4) {
["a"]=>
string(3)"one"
["b"]=>
string(3)"two"
["c"]=>
string(5)"three"
[3]=>
string(12)"number three"
}array_merge function merge
array(4) {
["a"]=>
string(6)"fourth"
["b"]=>
string(5)"fifth"
["c"]=>
string(5)"sixth"
[0]=>
string(12)"number three"
}
有趣的是,
因此,在与具有数字索引的
因此,用类似于
来源:https://softonsofa.com/php-array_merge-vs-array_replace-vs-plus-aka-union/
停止使用数组合并($defaults,$options):
1 2 3 4 5 6 |
注:数组替换函数自php5.3起就存在。
我相信
还有一个例子(没有显式键的数组;关于操作符
1 2 3 4 5 | $a = array('apple'); $b = array('orange', 'lemon'); echo '$a + $b = '; print_r($a + $b); echo 'array_merge($a, $b) = '; print_r(array_merge($a, $b)); |
将给予:
1 2 3 4 5 6 7 8 9 10 11 | $a + $b = Array ( [0] => apple [1] => lemon ) array_merge($a, $b) = Array ( [0] => apple [1] => orange [2] => lemon ) |
所以很明显,如果你改变顺序,联合和合并都会做同样的事情。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $a = array('foo' => 'bar', 'x' => 'fromA'); $b = array('foo' => null, 'x' => 'fromB'); echo '$a+$b: '; var_dump($a+$b); echo '$b+$a: '; var_dump($b+$a); echo 'array_merge($a, $b): '; var_dump(array_merge($a, $b)); echo 'array_merge($b, $a): '; var_dump(array_merge($b, $a)); |
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | $a+$b: array(2) { ["foo"]=> string(3)"bar" ["x"]=> string(5)"fromA" } $b+$a: array(2) { ["foo"]=> NULL ["x"]=> string(5)"fromB" } array_merge($a, $b): array(2) { ["foo"]=> NULL ["x"]=> string(5)"fromB" } array_merge($b, $a): array(2) { ["foo"]=> string(3)"bar" ["x"]=> string(5)"fromA" } |
记住数组的顺序。
请注意另一个区别:联合(+)不会用空值覆盖非空值(考虑相同的键),而数组合并将:
1 2 3 4 5 | $a = array('foo' => 'bar'); $b = array('foo' => ''); // or false or 0 print_r($a+$b); print_r(array_merge($a, $b); |
输出: