合并两个数组

Posted

技术标签:

【中文标题】合并两个数组【英文标题】:Combine two arrays 【发布时间】:2011-09-25 23:59:32 【问题描述】:

我有两个这样的数组:

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

有什么办法吗?

【问题讨论】:

【参考方案1】:

只需使用:

$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

【讨论】:

@KingCrunch - 即使引用了数字,它们也不是不是字符串键,因此索引将被保留。示例:ideone.com/I2NFT 真的...首先我想谈谈“一个错误”,但后来我注意到,手册只讨论了“数字键”,而不是“整数键”。感觉有点混乱。 +1 我忘了运营商!非常好(把那部分加粗!;)) 所以$array1 + $array2 是简短而有效的解决方案,而不是array_merge() - array_combine() 组合 警告!对于非关联数组或者如果数组有公共键 $a + $b != array_merge($a, $b)【参考方案2】:

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

【讨论】:

【参考方案3】:

这行得通:

$output = $array1 + $array2;

【讨论】:

我不建议这样做,因为它的行为非常不直观,例如[1,2,3] + [4,5,6] == [1,2,3] @jchook 那你有什么推荐的? 这是我需要的,谢谢。原因如下:http_build_query(array_merge($array1, $array2)) 对我不起作用,而 http_build_query($array1 + $array2) 对我起作用。【参考方案4】:

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

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

扩展运算符应该比array_merge有更好的性能

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

【讨论】:

【参考方案5】:

为此,您可以遍历一个并附加到另一个:

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

【讨论】:

【参考方案6】:

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

$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 具有数组的字符串键(这不适用于扩展运算符),并且 OP 希望保留键(扩展运算符丢弃键)。OP 也不希望重复。 哦,我明白你的观点了。这是真的,你是对的。您能否提供一些代码来帮助我们改进我对其他人的回答?我会很感激你的时间!非常感谢您指出我的答案的缺点。 我不认为传播运算符是这里的方法。而是使用给定的答案$array1 + $array2 我不知道这一点!我的意思是,我不知道我们可以做到$ouput = $array1 + $array2。现在我学到了一些新东西!谢谢!【参考方案7】:

这行得通:

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

【讨论】:

【参考方案8】:

警告! $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。希望对您有所帮助。

【讨论】:

array_merge() 不保留密钥。由它创建的数组是 0 索引的。 @HPierce 好吧,在多维数组加法的情况下,使用+ 会丢失一些信息。看一下:PHPFiddle,$b[0] 会丢失...【参考方案9】:

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

【讨论】:

以上是关于合并两个数组的主要内容,如果未能解决你的问题,请参考以下文章

C语言合并两个数组

python 中两个数组如何合并为一个数组。

合并两个有序数组

java 合并排序数组 - 合并两个排序的数组

请你告诉我合并两个数组,你有多少种方法

java中怎么合并两个数组 简单明了的