2011-06-30 305 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]将会丢失... –