合并两个数组

时间:2011-06-30 13:24:58

标签: php arrays unique

我有两个这样的数组:

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 ) );

任何解决方案?

9 个答案:

答案 0 :(得分:129)

只需使用:

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

那应该解决它。因为如果一个键出现多次(例如,在示例中为'44'),则使用字符串键,一个键将覆盖具有相同名称的过程键。因为在你的情况下它们都具有相同的值,无论如何它都无关紧要,它也会删除重复。

更新:我刚才意识到,PHP将数字字符串键视为数字(整数),因此表现得像这样,这意味着,它也会重新编号键......

解决方法是重新创建密钥。

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

更新2:我总是忘记,还有一个操作员(粗体,因为这是真的你在寻找什么!:D)

$output = $array1 + $array2;

所有这些都可以在以下方面看到: http://php.net/manual/en/function.array-merge.php

答案 1 :(得分:30)

您应该考虑$array1 + $array2 != $array2 + $array1

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

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

$ array1 + $ array2

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

并使用 $ array2 + $ array1

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

答案 2 :(得分:24)

这有效:

$output = $array1 + $array2;

答案 3 :(得分: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));

?>

更新:KingCrunch提出了best solutionprint_r($array1+$array2);

答案 4 :(得分:1)

这有效:

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

答案 5 :(得分:1)

警告! $ array1 + $ array2 会覆盖密钥,所以我的解决方案(对于多维数组)是使用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。希望它有所帮助。

答案 6 :(得分:1)

如果您使用的是PHP 7.4或更高版本,则可以使用扩展运算符...作为PHP Docs中的以下示例:

$arr1 = [1, 2, 3];
$arr2 = [...$arr1]; //[1, 2, 3]
$arr3 = [0, ...$arr1]; //[0, 1, 2, 3]
$arr4 = array(...$arr1, ...$arr2, 111); //[1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3]

function getArr() {
  return ['a', 'b'];
}
$arr6 = [...getArr(), 'c']; //['a', 'b', 'c']

$arr7 = [...new ArrayIterator(['a', 'b', 'c'])]; //['a', 'b', 'c']

function arrGen() {
    for($i = 11; $i < 15; $i++) {
        yield $i;
    }
}
$arr8 = [...arrGen()]; //[11, 12, 13, 14]

它的工作方式类似于JavaScript ES6。

有关https://wiki.php.net/rfc/spread_operator_for_array的更多信息。

答案 7 :(得分:1)

使用 php7.4 的新方法是Spread运算符 [...]

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
var_dump($fruits);

传播算子应该比array_merge

具有更好的性能

Spread运算符的显着优点是它支持任何可遍历的对象,而array_merge函数仅支持数组。

答案 8 :(得分:0)

https://www.php.net/manual/en/function.array-merge.php

<?php
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
print_r($result);
?>