【发布时间】:2012-05-07 15:59:37
【问题描述】:
数学中有 3 种集合运算:交集、差集和并集(统一)。在 PHP 中,我们可以对数组执行此操作:
- 路口:
array_intersect - 区别:
array_diff
联合的作用是什么?
结果数组中不能有重复项(如array_intersect 和array_diff)。
如果索引是数字,则array_merge 不会覆盖原始值,而是会被附加 (PHP docs)。
【问题讨论】:
数学中有 3 种集合运算:交集、差集和并集(统一)。在 PHP 中,我们可以对数组执行此操作:
array_intersect
array_diff
联合的作用是什么?
结果数组中不能有重复项(如array_intersect 和array_diff)。
如果索引是数字,则array_merge 不会覆盖原始值,而是会被附加 (PHP docs)。
【问题讨论】:
【讨论】:
array_values。
array_flip 将值放入键中,以便应用数组联合运算符 - 请参阅我的答案。
php -r 'var_dump(array_unique(array_merge(["a"=>"cat","b"=>"dog"], ["b"=>"cow","c"=>"hen"])));' 产生 ['cat','cow','hen'] 因为具有相同字符串键的值被覆盖。为了避免这个问题,在合并之前对每个输入数组调用array_values,如下:php -r 'var_dump(array_unique(array_merge(array_values(["a"=>"cat","b"=>"dog"]), array_values(["b"=>"cow","c"=>"hen"]))));'
array_unique( array_merge( ... ) )
【讨论】:
Adrien 的回答不需要从两个顺序编号的数组中生成顺序编号的数组 - 这里有一些选项可以:
array_values(array_unique(array_merge($array1, $array2)));
(Adrien 的回答是随后重新编号)
array_keys(array_flip($array1)+array_flip($array2))
(将值放入键中,并使用数组联合运算符)
array_merge($array1, array_diff($array2, $array1))
(合并前从第二个数组中删除共享值)
基准测试结果(用于在我的系统上将两个长度为 1000 的数组合并一千次):
相同的测试,但两个数组非常相似(至少 80% 重复):
似乎使用数组联合运算符进行实际联合是最快的方法。但是请注意,array_flip 仅在数组的值全部为字符串或全部为整数时才是安全的;如果您必须生成对象数组的并集,我推荐使用array_merge 和array_diff 的版本。
【讨论】:
使用“+”运算符来执行此操作。见链接Array Operators
【讨论】:
+ 运算符被定义为数组联合。你是对的,它做了一个键的联合,但它 chooses the first array over the second when removing duplicates 与 array_merge 相反。
同时使用array_unique 和array_merge。
【讨论】:
来自PHP: Array Operators 文档中的代码:
<?php
$a = array("a" => "apple", "b" => "banana");
$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry");
$c = $a + $b; // Union of $a and $b
echo "Union of \$a and \$b: \n";
var_dump($c);
$c = $b + $a; // Union of $b and $a
echo "Union of \$b and \$a: \n";
var_dump($c);
?>
执行时,此脚本将打印以下内容:
$a 和 $b 的并集: 数组(3){ [“一”]=> 字符串(5)“苹果” ["b"]=> 字符串(6)“香蕉” ["c"]=> 字符串(6)“樱桃” } $b 和 $a 的联合: 数组(3){ [“一”]=> 字符串(4)“梨” ["b"]=> 字符串(10)“草莓” ["c"]=> 字符串(6)“樱桃” }【讨论】:
array_unique(array_merge($a,$b))
OP 没有指定联合是按 value 还是按 key,PHP 有 array_merge 用于合并值,+ 用于合并键。结果取决于数组是索引还是键控以及哪个数组先出现。
$a = ['a', 'b'];
$b = ['b', 'c'];
$c = ['a' => 'A', 'b' => 'B'];
$d = ['a' => 'AA', 'c' => 'C'];
array_merge
array_merge($a, $b); // [0 => 'a', 1 => 'b', 2 => 'b', 3 => 'c']
array_merge($b, $a); // [0 => 'b', 1 => 'c', 2 => 'a', 3 => 'b']
+操作符按键合并$a + $b; // [0 => 'a', 1 => 'b']
$b + $a; // [0 => 'b', 1 => 'c']
array_merge
array_merge($c, $d); // ['a' => 'AA', 'b' => 'B', 'c' => 'C']
array_merge($d, $c); // ['a' => 'A', 'c' => 'C', 'b' => 'B']
+操作符按键合并$c + $d; // ['a' => 'A', 'b' => 'B', 'c' => 'C']
$d + $c; // ['a' => 'AA', 'c' => 'C', 'b' => 'B']
【讨论】:
$result = array_merge_recursive($first, $second);
当你的数组里面有数组时会很有用。
【讨论】:
+ 运算符:
$x[0] = 4;
$x[1] = 1;
$y[0] = 9;
$y[2] = 5;
$u = $y + $x;
// Results in:
$u[0] === 9;
$u[1] === 1;
$u[2] === 5;
注意$x + $y != $y + $x
【讨论】:
只需使用$array1 + $array2
这将导致两个数组的联合。
【讨论】:
试试这个:
function array_union($array1, $array2){
return array_unique(array_merge($array1, $array2));
}
【讨论】: