PHP 使用+ 操作符,array_merge 函數,以及array_merge_recursive 函數進行合併數組的區別
PHP中array_merge
函數和+
操作符都可以實現數組合併的功能,但是兩者俱有一些差異點,如果在實際使用過程中,沒有很好的理解他們之間的差異點,就會造成重大的bug:
首先看一下array_merge()
的官方功能介紹,array_merge()
將一個或多個數組的單元合併起來,一個數組中的值附加在前一個數組的後面。返回作為結果的數組。
如果輸入的數組中有相同的字符串鍵名,則該鍵名後面的值將覆蓋前一個值。
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
print_r($result);
輸出:
Array
(
[color] => green
[0] => 2
[1] => 4
[2] => a
[3] => b
[shape] => trapezoid
[4] => 4
)
然而,如果數組包含數字鍵名,後面的值將不會覆蓋原來的值,而是附加到後面,如果其中一個數組是數字索引的,則返回數組的鍵名會以連續方式重新索引。
$array1 = array("color" => "red");
$array2 = array(1 => "data");
$result = array_merge($array1, $array2);
print_r($result);
輸出:
Array
(
[0] => red
[0] => data
)
如果你想完全保留原有數字索引數組並只想新的數組附加到後面,用+ 運算符:
$array1 = array(0 => 'zero_a', 2 => 'two_a', 3 => 'three_a');
$array2 = array(1 => 'one_b', 3 => 'three_b', 4 => 'four_b');
$result = $array1 + $array2;
print_r($result);
第一個數組的鍵名將會被保留。在兩個數組中存在相同的鍵名時,第一個數組中的同鍵名的元素將會被保留,第二個數組中的元素將會被忽略,輸出:
array(
[0] => zero_a
[2] => two_a
[3] => three_a
[1] => one_b
[4] => four_b
)
另外,和array_merge()
不同,array_merge_recursive()
不會進行鍵名覆蓋,而是將多個相同鍵名的值遞歸合併成一個數組。
$fruit1 = array("apple" => "red", "banana" => "yellow");
$fruit2 = array("pear" => "yellow", "apple" => "green");
$result = array_merge_recursive($fruit1, $fruit2);
print_r($result);
輸出結果:
array (
[apple] => array (
[0] => red
[1] => green
)
[banana] => yellow
[pear] => yellow )
總結一下:他們主要區別是兩個或者多個數組中如果出現相同鍵名,鍵名分為字符串或者數字,需要注意
1)鍵名為數字時,array_merge()
不會覆蓋掉原來的值,但+合併數組則會把最先出現的值作為最終結果返回,而把後面的數組擁有相同鍵名的那些值“拋棄”掉(不是覆蓋),並且array_merge()
返回數組的鍵名會以連續方式重新索引。
2)鍵名為字符時,+
仍然把最先出現的值作為最終結果返回,而把後面的數組擁有相同鍵名的那些值“拋棄”掉,但array_merge()
此時會覆蓋掉前面相同鍵名的值。這種情況下,可以簡單理解為array_merge($array_1, $array_2)
等同於$array_2 + $array_1
。
3)array_merge_recursive()
不會進行鍵名覆蓋,而是將多個相同鍵名的值遞歸合併成一個數組。