2011-03-22 102 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 
} 

記住數組的順序。

相關問題