合并两个数组


88

我有两个这样的数组:

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

有什么办法吗?

Answers:


161

只需使用:

$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


5
@KingCrunch-即使引用了数字,但它们不是字符串键,因此不会保留索引。例如:ideone.com/I2NFT
Brendan Bullen

1
真的...首先,我想谈一谈“错误”,但是后来我注意到,该手册仅讨论了“数字键”,而不是“整数键”。感到有些困惑。
KingCrunch 2011年

+1我忘了接线员!太好了(以粗体显示!;))
布伦丹·布伦

3
因此$array1 + $array2,简短有效的解决方案是替代array_merge() - array_combine()组合
Awan

2
警告!对于非$a + $b != array_merge($a, $b)
关联

33

您应该考虑到 $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'  
);

25

这有效:

$output = $array1 + $array2;

12
我不建议这样做,因为它的行为非常不直观,例如[1,2,3] + [4,5,6] == [1,2,3]
jchook

@jchook那你有什么建议?
Michas '16

这就是我需要的,谢谢。原因如下:http_build_query(array_merge($array1, $array2))对我不起作用,对我却起作用http_build_query($array1 + $array2)
BarryMode '17

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提出了最佳解决方案print_r($array1+$array2);


2

如果您使用的是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上查看更多信息。


这不适用于该问题。该OP具有字符串键的数组(与传播运营商那并不是“T工作)和OP要保存键(传播运营商扔掉键)也OP不想重复。
马尔蒂·

哦,我明白你的观点。是的,你是对的。您能否提供一些代码来帮助我们改善其他人的答案?多谢您的宝贵时间!非常感谢您指出我的回答的弊端。
理科学生

我认为散布算子不是去这里的方法。而是使用给定的答案$array1 + $array2
Martti

我没有意识到这一点!我的意思是,我不知道我们能做到$ouput = $array1 + $array2。现在我学到了一些新东西!谢谢!
理科学生

1

这有效:

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

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

完美地工作。希望它能对您有所帮助。


1
array_merge()虽然不保留密钥。所创建的数组的索引为0。
HPierce '17

@HPierce好,在添加多维数组的情况下,使用会丢失一些信息+。看看:PHPFiddle,$ b [0]将丢失...
Norman Edance 17-11-22

1

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

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

传播算子应该比 array_merge

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.