php数组取交集最直接用array_intersect(),它按值比较并保留首数组键名;需键值双匹配用array_intersect_assoc();处理对象或嵌套数组需array_uintersect()配合自定义函数。

PHP数组取交集用 array_intersect() 最直接
要获取多个数组的共同元素,array_intersect() 是最常用也最符合直觉的选择。它按值比较,返回第一个数组中**同时存在于所有其他数组里的值**,键名保留原始键名(不是数字索引重排)。
- 只比较值,不关心键名;键名来自第一个参数数组
- 数据类型严格匹配:字符串
"1"和整数1被视为不同 - 如果需忽略大小写,得先统一转小写再交集,
array_intersect()本身不提供选项 - 示例:
$a = ['a' => 1, 'b' => 2, 'c' => 3];<br>$b = [2, 3, 4];<br>$c = [1, 3, 5];<br>print_r(array_intersect($a, $b, $c)); // 输出 Array ( [c] => 3 )
需要按键名+值都匹配?用 array_intersect_assoc()
当必须同时校验键名和值是否一致时,array_intersect_assoc() 才是正确选择。它会检查键名是否相同、对应值是否相等(类型也参与比较)。
- 适用于配置合并、结构化数据比对等场景
- 性能略低于
array_intersect(),因多一层键名判断 - 注意:关联数组和索引数组混用时,数字键名可能被 PHP 自动转为整型,导致意外不匹配
- 示例:
$x = ['id' => 100, 'name' => 'foo'];<br>$y = ['id' => 100, 'age' => 25];<br>print_r(array_intersect_assoc($x, $y)); // 输出 Array ( [id] => 100 )
遇到对象或复杂嵌套数组怎么办
array_intersect() 对对象或含数组的元素直接失效——因为 PHP 无法用默认方式比较对象是否“相等”,也会报 Notice: Array to string conversion。
- 简单办法:用
array_uintersect()配合自定义比较函数 - 若元素是对象,需在回调里明确比较逻辑,比如比较
$a->id === $b->id - 嵌套数组建议先用
json_encode()转成字符串再比(仅限结构稳定、无浮点精度/顺序敏感场景) - 别试图用
serialize(),它包含类名、引用信息,极易误判
性能与边界容易被忽略的点
数组越大,交集计算越慢,尤其是传入大量小数组时,array_intersect() 内部是 O(n×m) 复杂度。
- 把最大数组放在第一个参数位置,能略微减少内部遍历次数
- 提前
array_unique()去重,避免重复值拖慢比较 - 如果只是判断“是否存在交集”,不用全量结果,改用
count(array_intersect($a, $b)) > 0不够高效;更优是array_filter($a, fn($v) => in_array($v, $b)) !== []或用array_keys($b, $v)做哈希查找 - PHP 8.1+ 支持
array_key_first()等辅助函数,但交集本身没新语法糖,别等“更简洁写法”
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











