Array_merge 和 array + array 的区别是什么?

一个很简单的问题,两者的区别是什么:

$merged = array_merge($array1, $array2);

还有

$merged = $array1 + $array2;

74248 次浏览

区别在于:

+运算符接受两个数组的并集,而 array_merge函数接受并集 但是,重复的键被覆盖。

array_merge()导致在输入数组中找到的所有数字键在结果数组中被重新索引。联合运算符 +不会导致重新索引。

我相信 array_merge会覆盖重复的非数值键,而 $array1 + $array2不会。

下面是一个简单的说明性测试:

$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));

结果是:

Array
(
[0] => 1-0
[a] => 1-a
[b] => 1-b
[1] => 2-1
[c] => 2-c
)
Array
(
[0] => 1-0
[a] => 1-a
[b] => 2-b
[1] => 2-0
[2] => 2-1
[c] => 2-c
)

注意,重复的非数值键将使用联合运算符获取第一个值,但是使用 array _ merge 获取后一个值。

对于数字键,第一个值将与联合运算符一起使用,而所有值将与 array _ merge 一起使用,只是重新索引。

我通常对关联数组使用联合运算符,对 numeric 使用 array _ merge。当然,也可以将 array _ merge 用于关联,只是后面的值会覆盖前面的值。

+ 符号只接受数组键的 第一值。
Array _ merge 从数组键的 最后匹配项中获取值。

例如:

    $first = ['a'=>'one',
'b'=>'two',
'c'=>'three'];
                    

$second = ['a'=>'fourth',
'b'=>'fifth',
'c'=>'sixth',
'3'=>'number three'];
                    

$merged = $first + $second;
echo "<pre> plus sign merge\n";
var_dump($merged);
    

$merged = array_merge($first,$second);
echo "\n array_merge function merge\n";
var_dump($merged);

This outputs:

加号合并
数组(4){
[“ a”] = >
字符串(3)“一”
[“ b”] = >
字符串(3)“2”
[“ c”] = >
字符串(5)“三”
[3] = >
字符串(12)“ number three”
}

Array _ merge 函数合并
数组(4){
[“ a”] = >
字符串(6)“第四”
[“ b”] = >
字符串(5)“第五”
[“ c”] = >
字符串(5)“第六”
[0] = >
字符串(12)“ number three”
}

值得注意的是,array_merge实际上是数字3的“3”索引,尽管它是一个字符串,因为它是一个数字。

因此,在使用带有数值索引的 array_merge数组进行合并时要小心。他们可能会丢了钥匙。如果它们对你很重要,在它们前面加一个字符串。

使用类似于 '_3' => 'three'的代替 '3' => 'three'


另外,如果使用数值索引,需要注意的是,如果添加两个数组,它只查看数值索引,并从具有具有该值的数组键的“第一个”数组中获取值。

数组合并将把数组合并在一起,忽略相似的键和值。

因此,根据数组索引(数值或字符串)的“类型”,结果会有所不同。

$arr = ['foo', 'bar', 'baz'];
$arr2 = ['xfoo', 'xbar', 'baz'];
$arr3 = $arr2 + $arr;
$arr4 = array_merge($arr, $arr2);
var_dump($arr3);

结果是:

array(3) {
[0]=>
string(4) "xfoo"
[1]=>
string(4) "xbar"
[2]=>
string(3) "baz"
}
array(6) {
[0]=>
string(3) "foo"
[1]=>
string(3) "bar"
[2]=>
string(3) "baz"
[3]=>
string(4) "xfoo"
[4]=>
string(4) "xbar"
[5]=>
string(3) "baz"
}


Var _ dump ($arr4) ;

请注意另一个区别: union (+)不会用空值覆盖非空值(考虑同一个键) ,而 array _ merge 会:

$a = array('foo' => 'bar');
$b = array('foo' => ''); // or false or 0


print_r($a+$b);
print_r(array_merge($a, $b);

产出:

Array
(
[foo] => bar
)
Array
(
[foo] => 0
)

还有一个例子(没有显式键的数组; 操作符 +array_merge的工作方式是显而易见的,但是“显而易见”的东西看起来更简单;)

$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));

将给予:

$a + $b = Array
(
[0] => apple
[1] => lemon
)
array_merge($a, $b) = Array
(
[0] => apple
[1] => orange
[2] => lemon
)

所以很明显,如果你改变顺序,联合和合并都会做同样的事情

$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));

产出:

$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"
}

请记住数组的顺序。

array_merge vs plus

资料来源: https://softonsofa.com/php-array_merge-vs-array_replace-vs-plus-aka-union/

停止使用 array _ merge ($default,$options) :

function foo(array $options)
{
$options += ['foo' => 'bar'];


// ...
}

注意 : 从 PHP5.3开始数组替换函数就存在了。