PHP数组并集有四种方式:1. array_merge()重排数字键、覆盖字符串键;2. +运算符保留左数组键值、不重排不覆盖;3. array_merge()+array_unique()实现值去重并集;4. foreach自定义逻辑处理多维或字段判重。

PHP里用 array_merge() 做简单并集,但要注意键名冲突
直接合并两个数组最常用的是 array_merge(),但它对数字键和字符串键处理不同:数字键会重排,字符串键会覆盖(后出现的值生效)。比如:
$a = [0 => 'x', 'name' => 'A'];<br>$b = [1 => 'y', 'name' => 'B'];<br>var_dump(array_merge($a, $b));<br>// 输出:[0=>'x', 1=>'y', 'name'=>'B']如果你只是想“把所有元素堆一起”,且不关心键名重复问题,这一步就够了。
要保留所有键值不覆盖?得用 + 运算符
加号运算符做数组合并时,左边数组的键值优先保留,右边只补充左边没有的键。它不重排数字键,也不覆盖已有字符串键:
$a = ['a' => 1, 'b' => 2];<br>$b = ['b' => 3, 'c' => 4];<br>var_dump($a + $b);<br>// 输出:['a'=>1, 'b'=>2, 'c'=>4]注意:
+ 不递归,嵌套数组不会被合并;也不能用于索引数组去重,因为数字键相同就会被跳过。
真正意义上的“并集”——去重合并,得靠 array_unique() 配合 array_merge()
如果目标是像数学并集那样“所有不重复的值”,就得先合并再去重。但要注意:array_unique() 默认只比较值,不保留原始键名(数字键会被重排,字符串键保留):
$a = [1, 2, 3];<br>$b = [3, 4, 5];<br>$union = array_unique(array_merge($a, $b));<br>// 结果:[0=>1, 1=>2, 2=>3, 3=>4, 4=>5]如果数组含混合类型(如
0 和 '0'),默认模式会认为它们相等;需要严格区分时,传入 SORT_REGULAR 参数。多维数组或需自定义逻辑?别硬套内置函数,写个循环更稳
内置函数都是一维扁平处理。遇到对象、关联子数组、或按某个字段(比如 id)去重时,array_merge() 和 array_unique() 都无能为力。这时候老实用 foreach 扫描,用一个临时 $seen 数组记录已存在项:
$items = [['id'=>1,'v'=>'a'], ['id'=>2,'v'=>'b']];<br>$more = [['id'=>2,'v'=>'c'], ['id'=>3,'v'=>'d']];<br>$union = [];<br>$seen = [];<br>foreach (array_merge($items, $more) as $item) {<br> if (!in_array($item['id'], $seen)) {<br> $union[] = $item;<br> $seen[] = $item['id'];<br> }<br>}这种写法清晰、可控,也容易加条件(比如只合并 status === 'active' 的项)。
立即学习“PHP免费学习笔记(深入)”;
真正麻烦的从来不是“怎么写并集”,而是你到底要并什么:是键?是值?是否递归?是否按某字段判重?没理清这点,光套函数反而埋坑。



















