2011-06-30 312 views
46

我有兩個數組是這樣的:合併兩個數組

array( 
'11' => '11', 
'22' => '22', 
'33' => '33', 
'44' => '44' 
); 

array( 
'44' => '44', 
'55' => '55', 
'66' => '66', 
'77' => '77' 
); 

我想這兩個陣列,它不包含重複的和以及保持其原有的按鍵組合。例如輸出應該是:

array( 
'11' => '11', 
'22' => '22', 
'33' => '33', 
'44' => '44', 
'55' => '55', 
'66' => '66', 
'77' => '77' 
); 

我都試過,但它正在改變其原有鍵:

$output = array_unique(array_merge($array1 , $array2)); 

任何解決方案?

回答

92

只需使用:

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

這應該解決這個問題。因爲如果一個鍵出現一次以上時使用字符串鍵(例如在您的示例中爲'44'),則一個鍵將覆蓋具有相同名稱的後續鍵。因爲在你的情況下,它們都具有相同的值,無所謂,它也會刪除重複項。

更新:我剛剛意識到,PHP把數字字符串鍵作爲數字(整數),因此將這樣的表現,什麼手段,它重新編號的鑰匙太...

一種解決方法是重新創建密鑰。

$output = array_combine($output, $output); 

更新2:我總是忘了,這裏面還有一個運營商(以粗體,因爲這是真的您正在尋找什麼!d)

$output = $array1 + $array2; 
+3

@KingCrunch - 即使數字被引用,這些都是**不是**字符串鍵,因此索引將不會被保留。例如:https://ideone.com/I2NFT –

+0

真的......首先我想談論「一個bug」,但後來我注意到,手冊只談到「數字鍵」,而不是「整數鍵」。感覺有點混亂。 – KingCrunch

+0

+1我忘了操作員!優秀的(把這部分用粗體表示!)) –

4

要做到這一點,你可以通過一個環附加到其他:

<?php 

$test1 = array( 
'11' => '11', 
'22' => '22', 
'33' => '33', 
'44' => '44' 
); 

$test2 = array( 
'44' => '44', 
'55' => '55', 
'66' => '66', 
'77' => '77' 
); 


function combineWithKeys($array1, $array2) 
{ 
    foreach($array1 as $key=>$value) $array2[$key] = $value; 
    asort($array2); 
    return $array2; 
} 

print_r(combineWithKeys($test1, $test2)); 

?> 

UPDATE: KingCrunch想出了best solutionprint_r($array1+$array2);

22

這工作:

$output = $array1 + $array2; 
+3

我不會推薦這是因爲它的行爲非常不直觀,例如'[1,2,3] + [4,5,6] == [1,2,3]' – jchook

+0

@jchook你推薦什麼? – Michas

+0

這是我需要的,謝謝。原因如下:'http_build_query(array_merge($ array1,$ array2))'不適合我,而'http_build_query($ array1 + $ array2)'沒有。 – BarryMode

2

這工作:

$a = array(1 => 1, 2 => 2, 3 => 3); 
$b = array(4 => 4, 5 => 5, 6 => 6); 
$c = $a + $b; 
print_r($c); 
20

你應該採取考慮到$array1 + $array2 != $array2 + $array1

$array1 = array(
'11' => 'x1', 
'22' => 'x1' 
); 

$array2 = array(
'22' => 'x2', 
'33' => 'x2' 
); 

$ array1 + $數組2

$array1 + $array2 = array(
'11' => 'x1', 
'22' => 'x1', 
'33' => 'x2' 
); 

$數組2 + $陣列1

$array2 + $array1 = array( 
'11' => 'x1', 
'22' => 'x2', 
'33' => 'x2' 
); 
1

警告!$陣列1 + $數組2覆蓋鑰匙,所以我的解決方案(多維數組)是使用array_unique()

array_unique(array_merge($a, $b), SORT_REGULAR); 

注:

5.2.10+改變的sort_flags默認值回到SORT_STRING。

5.2.9默認爲SORT_REGULAR。

5.2.8-默認爲SORT_STRING

perfectly works。希望它可以幫助一樣。

+1

'array_merge()'雖然不保留鍵。由它創建的數組是0索引。 – HPierce

+0

@Hierier很好,在多維數組添加的情況下,有些信息會使用'+'丟失。看看:[PHPFiddle](https://www.tehplayground.com/dHlrF78YWWh5jC8H),$ b [0]將會丟失... –