PHP数组交集用array_intersect(值相同、键取首个数组、类型严格),并集常用array_unique(array_merge());手写需处理多维、键名保留、类型统一等细节,常见陷阱包括空数组、类型混用和浮点精度问题。

PHP 中数组交集与并集的实现,核心在于理解内置函数的行为和边界情况处理。直接用 array_intersect 和 array_merge + array_unique 最常用,但面试或算法题常要求手写逻辑、处理多维、去重规则、键名保留等细节。
交集:保留相同值,键名取第一个数组的
array_intersect($arr1, $arr2, ...) 返回所有参数中都存在的值组成的数组,键名保持原样(来自第一个数组),不比较键名只比值。注意:类型严格比较(1 和 "1" 不相等)。
- 手写简化版(单层一维):遍历第一个数组,用
in_array(..., $others, true)判断是否在其余每个数组中都存在 - 若需键名对齐(即“键+值”同时匹配),改用
array_intersect_assoc - 多维数组不能直接用内置函数——需递归展开或自定义比较逻辑,比如用
json_encode转字符串再比(慎用于含资源/对象的数组)
并集:合并所有元素,自动去重(值去重,非键去重)
PHP 没有直接叫 array_union 的函数,常规做法是:array_unique(array_merge($arr1, $arr2, ...))。注意:array_merge 会重置数字键,关联键冲突时后者覆盖前者;array_unique 默认按字符串比较,可用 SORT_REGULAR 保持类型。
- 要保留所有键名且不覆盖?改用
$result = $arr1 + $arr2 + ...(加号合并,关联键前者优先,数字键不重置但不会去重) - 真·并集(值唯一 + 键名尽量保留):先
array_merge,再array_unique,最后用array_values或array_keys重建键(依需求) - 若数组含嵌套结构,
array_unique会失败(不支持多维),此时需序列化后去重再反序列化,或用foreach+serialize手动判重
常见陷阱与调试建议
交集/并集结果为空?别急着改逻辑,先检查:
立即学习“PHP免费学习笔记(深入)”;
- 数组是否为空或 null ——
array_intersect([], [1,2])返回空数组,不是 false - 值类型是否混用 ——
array_intersect([1], ["1"])返回空,加array_map('strval', ...)统一再比 - 浮点数精度问题 —— 用
bccomp或四舍五入后再比较 - NaN 或 INF 值 —— 它们和任何值(包括自己)用
==都为 false,array_unique也无法识别重复 NaN
扩展:对称差集(只在其中一个数组出现的元素)
可组合使用交集与并集:array_diff(array_merge($a, $b), array_intersect($a, $b));更高效写法是 array_merge(array_diff($a, $b), array_diff($b, $a)),避免多次合并大数组。
- 注意
array_diff也是值比较、键名忽略,行为与array_intersect对称 - 如需键名参与差集计算,用
array_diff_key或array_diff_assoc - 对称差集结果顺序取决于两个
array_diff的调用顺序,如需稳定排序,最后加sort或ksort











