先合并再统一去重更稳妥,能确保跨数组重复项被识别;array_merge()后接array_unique()是标准流程,注意键名保留及二维数组需序列化处理。

先合并,再去重是更稳妥、更符合直觉的做法。直接对多个数组分别去重再合并,容易漏掉跨数组的重复项;而先合并再统一去重,能确保所有重复值都被识别和清理。
array_merge() 后接 array_unique() 是最常用组合
这是处理一维数组合并去重的标准流程,尤其适合整数或字符串值:
-
array_merge()负责把所有数组按顺序拼成一个大数组,数字键自动重排,字符串键后覆盖前(这点要注意) -
array_unique()会遍历整个结果数组,逐个比对值(不是键),删掉后续重复出现的项,保留第一次出现的位置和键名 - 注意:
array_unique()返回的数组键名不会重置,如果需要连续数字索引,得额外加一步array_values()
示例:
$a = [1, 2, 3]; $b = [3, 4, 5]; $merged = array_merge($a, $b); // [1,2,3,3,4,5] $unique = array_unique($merged); // [0=>1, 1=>2, 2=>3, 4=>4, 5=>5] $indexed = array_values($unique); // [1,2,3,4,5]
用 array_flip + array_flip 做去重时,必须先合并
这种技巧依赖“键唯一性”来模拟值去重,只适用于纯值数组(不能有非标量值,否则会报错):
-
array_flip($arr)把值变键,重复值会被后出现的覆盖 —— 这就是去重的关键 - 但这个操作只能作用于单个数组;如果对 $a 和 $b 分别 flip,再 merge 键,逻辑混乱且不可控
- 正确做法是:
array_flip(array_merge($a, $b))→array_flip(...),中间不能断 - 缺点:丢失原始键名,且无法处理
null、array、object等非可键类型
二维数组不能直接用 array_unique()
PHP 的 array_unique() 默认只比较一维数组的值,对二维数组会直接返回原数组(PHP 7.2+ 会触发 warning):
- 想按某字段(如
'id')去重,得用array_column()+array_unique()提取键,再配合array_filter()筛选 - 想按整行完全相同去重,必须先
serialize()每个子数组,再array_unique(),最后unserialize()—— 性能差,慎用于大数据量 - 自定义函数(如按
'attr_id'去重)更可控,但要注意是否保留首次出现的元素,还是最后一次
真正容易被忽略的是:去重行为取决于你“认为什么是重复”。值相等?结构一致?某个字段相同?没明确这个,先合并还是先去重都救不了逻辑错误。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











