PHP如何按值合并两个数组并去除重复值?
PHP 合并数组并按值去重的最优方案
问题描述
假设有两个简单数组:
$a = [1, 2, 3]; $b = [2, 3, 4, 5];
需要合并成无重复值的数组,最终结果为:
[1, 2, 3, 4, 5];
试过array_merge()、array_replace()这类函数,但它们针对关联数组的键操作,不符合按值处理的需求;Laravel集合的->merge()、->concat()、->replace()、->union()等方法也无法实现按值去重合并。不想用foreach结合in_array()的低效写法,求更优方案。
2022年9月8日编辑:本问题曾被标记为另一问题的重复,但该问题的已接受答案并未解决按值合并的需求,其中的array_merge_recursive()也无法解决我的问题,且该问题涉及关联数组,而我完全不关注键,因此本问题并非重复。
原生PHP解决方案
方法1:array_merge + array_unique(直观易用)
先合并数组再去重,适合大多数常规场景:
// 合并去重,保留原数组索引 $merged = array_unique(array_merge($a, $b)); // 若需要重置为连续数字索引 $merged = array_values(array_unique(array_merge($a, $b)));
方法2:array_flip 两次(性能更优)
利用数组键的唯一性,通过两次反转实现去重,大数据量下效率明显更高:
// 合并去重,原索引会丢失(反转后键值互换) $merged = array_flip(array_flip($a) + array_flip($b)); // 重置为连续数字索引 $merged = array_values(array_flip(array_flip($a) + array_flip($b)));
Laravel集合解决方案
用concat()追加第二个集合的元素,再用unique()按值去重:
$collectionA = collect($a); $collectionB = collect($b); // 得到去重后的集合 $mergedCollection = $collectionA->concat($collectionB)->unique(); // 转为普通数组 $mergedArray = $mergedCollection->toArray();
内容的提问来源于stack exchange,提问作者Sturm
相关产品推荐
相关产品推荐

