合并两个数组
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);
?>
【讨论】:
以上是关于合并两个数组的主要内容,如果未能解决你的问题,请参考以下文章