array_diff() 是处理一维数组差集最高效的方式,时间复杂度接近 O(n+m),支持多数组比较且保留原始键名;关联数组需按需选用 array_diff_assoc()、array_diff_key() 或 array_diff_uassoc();多维数组推荐 array_udiff() 或序列化比对;大数据量时可结合 array_intersect() 或 array_flip() 优化性能。

直接用 array_diff() 是最常用也最高效的方式,尤其适合一维、值明确的数组。它底层用哈希表比对,时间复杂度接近 O(n+m),远优于手动循环嵌套。
用 array_diff 处理一维数值或字符串数组
这是 PHP 中最推荐的默认方案,无需额外逻辑,且自动保留原始键名:
- 只传两个数组时:返回 第一个数组中存在、其余数组中都不存在 的元素
- 支持多个数组:如
array_diff($a, $b, $c, $d)表示 “在 $a 里但不在 $b、$c、$d 中的元素” - 注意类型严格比较:
1和'1'被视为不同,避免隐式转换干扰结果
处理关联数组:选对函数很关键
若数组带键名(如 ['id' => 1, 'name' => 'Tom']),需按需求选择:
-
array_diff_assoc():同时比较键和值,键名不同即不匹配 -
array_diff_key():只比键名,忽略值内容,适合“剔除指定键”场景 -
array_diff_uassoc():自定义键+值比较逻辑,适用于需业务规则判定是否“相同”的情况
二维/多维数组差集:避免暴力循环
对含子数组的结构(如用户列表、配置项),不建议用双重 foreach —— 性能差且易出错:
- 优先用
array_udiff()+ 自定义比较函数,利用 PHP 内部优化的排序/比对机制 - 简单场景可序列化后比对:
array_map('unserialize', array_diff(array_map('serialize', $a), array_map('serialize', $b))),适合结构稳定、无资源句柄的数组 - 若需深度递归比对(如嵌套层级不固定),再考虑封装
array_diff_recursive(),但务必加缓存或提前终止条件防栈溢出
大数据量时的性能小技巧
当数组元素超万级,可进一步提速:
- 先用
array_intersect()找出交集,再用array_diff()计算差集——有时比单次array_diff()更快(尤其交集比例高时) - 确保输入数组已去重或预过滤,减少无效比对
- 若只关心值存在性(不要求键),可先转为
array_flip()构建查找表,再配合foreach+isset()判断,速度极快

















