array_intersect默认丢弃原始键名,应使用array_intersect_assoc保留关联键;需注意参数顺序、类型松散比较及大数组性能问题。

array_intersect 会丢键名,要保留原始键用 array\_intersect\_assoc
这个函数默认只比较值,不关心键名,所以返回数组的键是重排的数字索引。如果你传入的是关联数组(比如 $user = ['id' => 123, 'name' => 'Alice']),直接用 array_intersect 会丢失 'id' 和 'name' 这些键,只留值匹配的结果,且键变成 0、1……
常见错误现象:
– 原数组有 ['a' => 1, 'b' => 2],另一个是 [1, 2, 3],结果得到 [0 => 1, 1 => 2],而不是想要的 ['a' => 1, 'b' => 2]
– 后续用 $result['a'] 报错,因为键没了
- 想按值匹配但保留原始键 → 改用
array_intersect_assoc - 只关心值是否共存(如判断权限标签交集)→
array_intersect没问题 - 多个数组参与比较时,第一个数组决定返回哪些键(即使它没在其他数组里出现,只要值在其他数组中存在就保留)
参数顺序影响结果,第一个数组是“主参考”
array_intersect 返回的是第一个数组中「值也出现在所有后续数组里」的元素。顺序错了,结果就不是你想要的交集。
示例:
– array_intersect([1,2,3], [2,3,4]) → [0 => 2, 1 => 3]
– array_intersect([2,3,4], [1,2,3]) → [0 => 2, 1 => 3](值一样,但键来自第一个数组)
– array_intersect(['x' => 1, 'y' => 2], [2,3]) → ['y' => 2](如果用了 array_intersect_assoc,这里就为空,因为键 'y' 不在第二个数组里)
- 始终把你要“筛选依据”的那个数组放在第一位
- 如果目标是取公共值,但不care谁当主数组,建议先
array_values归一化再交集,避免键干扰 - 注意 null、false、0 在松散比较下可能被误判相等(比如
0 == false),需要严格类型匹配时改用array_uintersect+ 自定义回调
遇到字符串数字和整数混用,小心类型隐式转换
PHP 默认做松散比较(==),所以 '1' 和 1 被认为相等,'0' 和 false、0、'' 都可能被当成同一值。
常见错误现象:
– array_intersect(['1', '2'], [1, 3]) 返回 [0 => '1'](字符串 '1' 被当作整数 1 匹配成功)
– 本意是精确匹配字符串,结果数值型 ID 被意外包含
- 确保输入数组类型一致:统一用
array_map('strval', $arr)或array_map('intval', $arr)预处理 - 必须严格类型检查?用
array_uintersect配合function($a, $b) { return $a $b; } - 调试时可用
var_dump(array_map('gettype', $arr))快速看类型分布
性能差在大数组上,别在循环里反复调用
array_intersect 时间复杂度接近 O(n×m),两个数组各一万项,最坏要执行一亿次比较。线上接口里把它塞进 foreach 循环,很容易拖慢响应。
- 提前把“基准数组”转成
array_flip建索引(比如$allowed = array_flip(['read', 'write', 'delete'])),然后用isset($allowed[$item])单次 O(1) 判断 - 若必须用交集逻辑,把多次小交集合并成一次大交集:收集所有待比数组,一次性传给
array_intersect - 注意内存:
array_intersect返回新数组,原数组不会被修改,但大数组复制会吃内存
真正麻烦的从来不是语法怎么写,而是你没意识到第一个参数决定了键来源,也没想到 '1' 和 1 在它眼里根本没区别。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











