PHP數組合並函數(+)
、array_merge
、array_merge_recursive
PHP
中,有3種方法來進行數組合並:操作符(+)
、array_merge
、array_merge_recursive
,其中前兩種方式爲一維數組的合併,第三種爲遞歸合併。
在說PHP
的數組合並之前,先要明白,PHP
的數組分爲索引數組和關聯數組。
- 索引數組是指沒有鍵值和鍵值爲數字的數組。
- 關聯數組是指鍵值爲字符的數組。
下面說說操作符(+)
和array_merge
的區別:
當爲索引數組時,合併相同鍵值的數組,操作符以最前面的值爲合併後的結果,
array_merge
則是把相同鍵值的數組合並,並重新索引(不同鍵值的數組合並時,也會從0開始重新生成數字索引)。“+”運算符
規則:
: 當兩個數組的鍵名是數字鍵名或者字符串鍵名
$c = $a + $b
在$a
後追加($b
在$a
中不存在的鍵名)鍵名和值
注意:
1. 不覆蓋,只是追加不存在的鍵名和對應的值
2. 鍵名不重新索引
3. 無論是全部數字鍵名還是混合,都只是追加鍵名和值,如果鍵名相同則不進行追加,即把最先出現的值作爲最終結果返回例1:數字鍵名
1 $a = array( 'a', ); $b = array( 'u', ); $c = $a + $b; var_dump($c); output: array(1) { [0]=> string(1) "a" }
例2:數字鍵名
$a = array( 66=>'a', ); $b = array( 60=>'u', 66=>'c' ); $c = $a + $b; var_dump($c); output: array(2) { [66]=> string(1) "a" [60]=> string(1) "u" }
例3:字符鍵名
<?php $a = array( 1=>'a', 2=>'b', 'c'=>'c', 'd'=>'d', ); $b = array( 1=>'u', 3=>'v', 'c'=>'w', 'd'=>'x', 'y'=>'y', 60=>'z', ); $c = $a + $b; var_dump($c); ?> output: array(7) { [1]=> string(1) "a" [2]=> string(1) "b" ["c"]=> string(1) "c" ["d"]=> string(1) "d" [3]=> string(1) "v" ["y"]=> string(1) "y" [60]=> string(1) "z" }
當爲關聯數組時,合併相同字符鍵值的數組,操作符合並規則是前面的覆蓋後面的,array_merge則是後面的覆蓋前面的。
$arr5 = array('a'=>'aaaa'); $arr6 = array('a'=>'bbbb'); var_dump($arr5+$arr6); var_dump(array_merge($arr5,$arr6)); 輸出: array (size=1) 'a' => string 'aaaa' (length=4) array (size=1) 'a' => string 'bbbb' (length=4)
array_merge()
將一個或多個PHP
數組合並起來,一個數組中的值附加在前一個數組的後面。返回作爲結果的數組。
如果輸入的數組中有相同的字符串鍵名,則該鍵名後面的值將覆蓋前一個值。然而,如果數組包含數字鍵名,後面的值將不會覆蓋原來的值,而是附加到後面。
如果只給了一個數組並且該數組是數字索引的,則鍵名會以連續方式重新索引。array_merge_recursive
的合併規則和array_merge
相同,只是array_merge_recursive
支持多維數組的合併。$a = array( 1=>'a', 2=>'b', 'c'=>'c', 'd'=>'d', ); $b = array( 1=>'u', 3=>'v', 'c'=>'w', 'd'=>'x', 'y'=>'y', 60=>'z', ); var_dump(array_merge_recursive($a,$b)); 輸出: array (size=8) 0 => string 'a' (length=1) 1 => string 'b' (length=1) 'c' => array (size=2) 0 => string 'c' (length=1) 1 => string 'w' (length=1) 'd' => array (size=2) 0 => string 'd' (length=1) 1 => string 'x' (length=1) 2 => string 'u' (length=1) 3 => string 'v' (length=1) 'y' => string 'y' (length=1) 4 => string 'z' (length=1)