37

数学中有 3 种集合运算:交集、差集和并集(统一)。在 PHP 中,我们可以对数组执行此操作:

  • 路口:array_intersect
  • 不同之处:array_diff

联合的作用是什么?

结果数组中不能有重复项(如array_intersectarray_diff)。

如果索引是数字,则array_merge不会覆盖原始值,而是会附加(PHP 文档)。

4

11 回答 11

56

尝试array_merge

array_unique(array_merge($array1, $array2));

PHP 手册

于 2012-05-07T16:01:37.480 回答
11

array_unique( array_merge( ... ) )

于 2012-05-07T16:01:27.747 回答
11

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 的数组一千次):

  • 唯一(Adrien 的版本):2.862163066864 秒
  • Values_Unique:3.12 秒
  • Keys_Flip:2.34 秒
  • Merge_Diff:2.64 秒

相同的测试,但两个数组非常相似(至少 80% 重复):

  • 唯一(Adrien 的版本):2.92 秒
  • Values_Unique:3.15 秒
  • Keys_Flip:1.84 秒
  • Merge_Diff:2.36 秒

似乎使用数组联合运算符进行实际联合是最快的方法。但是请注意,array_flip只有当数组的值都是字符串或整数时才安全;如果您必须生成对象数组的并集,我推荐使用array_mergeand的版本array_diff

于 2014-04-01T19:32:39.583 回答
6

使用“+”运算符这样做。请参阅链接数组运算符

于 2014-05-23T05:54:33.367 回答
5

array_uniquearray_merge一起使用。

于 2012-05-07T16:03:02.593 回答
4

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)“樱桃”
}
于 2012-05-07T16:04:14.827 回答
2

OP 没有指定联合是按还是按键,PHP 具有array_merge用于合并值和+合并键的功能。结果取决于数组是索引的还是键控的以及哪个数组先出现。

$a = ['a', 'b'];
$b = ['b', 'c'];

$c = ['a' => 'A',  'b' => 'B'];
‌‌$d = ['a' => 'AA', 'c' => 'C'];

索引数组

array_merge

按价值使用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']
于 2019-09-23T10:06:45.507 回答
1
$result = array_merge_recursive($first, $second);

当您有包含数组的数组时会很有用。

于 2015-01-07T09:59:21.063 回答
0

+运营商:

$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

于 2012-05-07T16:07:15.173 回答
0

只需使用 $array1 + $array2 它将导致两个数组的联合。

于 2014-01-20T12:30:50.793 回答
0

试试这个:

function array_union($array1, $array2){
    return array_unique(array_merge($array1, $array2));
}
于 2021-05-11T09:10:30.857 回答