2011-03-22 79 views
82

一个相当简单的问题。有什么区别:array_merge和array + array有什么区别?

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

$merged = $array1 + $array2; 

+5

可能重复的[+运营商的数组在PHP?](http://stackoverflow.com/questions/2140090/operator-for-array-in-php) – Gordon 2011-03-22 16:06:15

+2

可能戈登,错过了,由于标题不是在其中有array_merge。 – 2011-03-22 16:08:58

+0

是的,可以。 NP。 – Gordon 2011-03-22 16:19:14

回答

57

的区别是:

+运算符采用两个阵列的结合,而array_merge函数采用联合BUT的重复键被覆盖)。

+0

那么,这两者之间有什么区别:[array_merge](http://codepad.org/6QdQh908),[加号](http://codepad.org/mu0aF3tN)(尽管我必须切换数组) ? – 2011-12-06 20:13:58

+14

对于初学者来说,这里有一个警告词,两种情况下的操作结果都是** null **,如果任何一个数组是** null **。有些人可能并不关心这个假设,因为它是一个联合操作,如果其中一个是** null **,结果将是正确的(非空)数组。但是,如果其中一个数组是空数组,则这种情况也适用。所以,作为一个好习惯,我认为,我们应该将输入数组初始化为空数组。你们说什么? – 2012-07-13 06:58:16

+3

如果有重复的密钥,“参加工会”将永远不会放弃其中的一个。不同之处在于哪一个。 – alexis 2016-03-11 09:19:48

43

array_merge()导致在输入数组中找到的所有数字键所得到的阵列中重建索引。工会运营商+不会导致重新索引。

5

我相信array_merge改写复制non_numeric键,在$array1 + $array2没有。

59

这里有一个简单的说明测试:

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

注意,重复非数字键使用UNION运算符,但使用后一个会第一时间值array_merge。

对于数字键,第一个值将与工会操作者使用,而所有的值将与array_merge使用,只是重建索引。

我一般使用关联数组联合运营商和array_merge的数字。当然,你可以使用array_merge来进行关联,只是后面的值会覆盖前面的值。

17

+符号仅从开始发生数组键。
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); 

此输出:

加符号合并
阵列(4){
[ “一”] =>
串(3)“一个“
[”b“] =>
string(3)”two“
[ “c” 的] =>
串(5)的 “三”
[3] =>
串(12) “数字3”
}

array_merge功能合并
阵列(4){
[ “一”] =>
串(6) “第四”
[ “b” 的] =>
串(5) “十五”
[ “c” 的] =>
串(5) “第六”
[0] =>
串(12) “数字3”
}

有趣在此要注意的是,array_merge actally 擦除的' 3'索引,即使它是一个字符串,因为它是一个数字。

所以请小心合并array_merge与数字索引数组。他们可能会丢失钥匙。如果它们对你来说很重要,那么在它们前面加一个字符串。

所以不是'3' => 'three'使用类似'_3' => 'three'

+4

“*即使它是一个字符串,因为它是一个数字*”值得+1 :-) – 2016-07-09 11:06:05

0

请另一个区别注意:工会(+)将不会覆盖与空值非空值(考虑相同的密钥),而array_merge将:

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

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

输出:

​​
2

另一个例子(数组没有明确的键,它对于很明显如何操作+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 
) 
0

无法对答案发表评论,所以我会再写一。

@ZalemCitizen根本就是错误的,工会(+)将覆盖非空值与空的:

$a = array('foo' => 'bar'); 
$b = array('foo' => null); 

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

输出:

array(1) { 
    ["foo"]=> 
    NULL 
} 
array(1) { 
    ["foo"]=> 
    NULL 
} 

记住数组的顺序。

相关问题