最稳妥的php数组合并去重方法是先array_merge()再array_unique(),注意顺序不可颠倒,多数组合并用展开运算符...,关联数组去重需注意键冲突,严格类型比较用sort_regular参数。

用 array_merge() + array_unique() 最稳妥
PHP 数组合并去重,最直接的组合就是先合并再去重。注意顺序:必须先 array_merge(),再 array_unique(),否则会丢键或报错。
常见错误是反过来调用,比如 array_unique($a, $b) —— 这根本不是合法用法,array_unique() 只接受一个数组参数。
-
array_merge()会重置数字键,字符串键保留;若需保留所有键(含数字键),改用+合并操作符(但不推荐用于去重场景) -
array_unique()默认按字符串比较,数值1和字符串"1"会被视为相同;如需严格类型区分,加第二个参数SORT_REGULAR - 去重后键名不会自动重排,若后续要遍历或 JSON 输出,建议再套一层
array_values()
$a = [1, 2, '3']; $b = [2, '3', 4]; $result = array_values(array_unique(array_merge($a, $b), SORT_REGULAR)); // → [1, 2, '3', 4]
合并多个数组时别手写嵌套 array_merge()
三个及以上数组合并,不要写成 array_merge(array_merge($a, $b), $c) —— 冗余且难维护。
PHP 5.6+ 支持展开运算符(...),一行搞定:
- 所有待合并数组必须是变量(不能是字面量数组直接展开,如
array_merge(...[[1],[2]])在某些旧版本会警告) - 如果数组来源是函数返回值,确保它确实返回数组,否则
...会展开 null 导致 fatal error - 合并前可先用
array_filter($arrays, 'is_array')清洗掉非数组项,避免意外崩溃
$arrays = [$a, $b, $c, $d]; $result = array_unique(array_merge(...$arrays), SORT_REGULAR);
关联数组去重要注意键冲突和语义丢失
如果数组带字符串键(比如 ['id' => 1, 'name' => 'A']),array_unique() 只比较值,不比较键。这意味着:
- 两个不同键对应相同值(如
['a' => 1, 'b' => 1])→ 去重后只剩第一个键('a' => 1),第二个被静默丢弃 - 若你实际想“按某个字段(如
id)去重”,就得自己写循环或用array_reduce()+ 索引缓存 -
array_unique()对多维数组只做浅比较,[['id'=>1]]和[['id'=>1]]被认为相同;但[['id'=>1,'x'=>2]]和[['id'=>1]]不同,不会去重
性能敏感场景慎用 array_unique()
处理上万条数据时,array_unique() 内部用哈希表实现,平均 O(n),但实际耗时受值类型影响大:
- 纯整数/短字符串最快;含大字符串、对象或嵌套数组会明显变慢(PHP 需序列化比较)
- 如果原始数组已排序且重复项相邻,手动遍历 + 比较前一项更快(省去哈希开销)
- 内存紧张时,
array_unique()会复制整个数组;超大数组建议分块处理或换用数据库去重
真正需要高性能去重时,往往说明数据本不该全在 PHP 层处理——该查库的查库,该加索引的加索引。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











