我有两个这样的数组:
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 ) );
任何解决方案?
答案 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 solution:print_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。
答案 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);
?>