array_intersect 返回交集时保留第一个数组的原始键名而非重排索引。它仅按值匹配,忽略键名;遇重复值只留首次出现的键;浮点数和布尔值存在类型转换风险;非数组参数会触发警告并返回null,需提前校验。

array_intersect 用来取多个数组的交集,只保留「在所有数组中都存在」的值(按值比较,不看键名)。它返回一个新数组,键名保留第一个数组中的原始键名。
为什么 array_intersect 返回的键名看起来“乱序”?
它不是按数值索引重排,而是原样保留第一个参数数组的键名。如果你传入的是关联数组,结果里键名和值都来自第一个数组;如果是 ['a', 'b', 'c'] 这种,键是 0、1、2,结果也照搬。
- 想重置键名?用
array_values(array_intersect(...)) - 想严格按顺序输出(比如配合
foreach遍历时依赖索引)?必须手动重索引 - 如果第一个数组有重复值,
array_intersect只保留第一次出现时的键 —— 它内部去重逻辑基于首次匹配
array_intersect 不比较键名,只比值
这是最容易误解的一点:哪怕两个数组键名完全一样、值不同,也不会出现在结果里;反过来,只要值相同,哪怕键名天差地别,也算“交集”。
$a = ['x' => 'apple', 'y' => 'banana']; $b = ['z' => 'apple', 'w' => 'cherry']; var_dump(array_intersect($a, $b)); // ['x' => 'apple']
- 键名
'x'和'z'毫无关系,但值都是'apple',所以命中 - 如果想同时校验键和值,得用
array_intersect_assoc - 如果值是浮点数或布尔值,注意 PHP 类型转换:
true会和1、'1'匹配,false会和0、''匹配
遇到空数组或非数组参数会怎样?
PHP 7.0+ 会抛出 Warning: array_intersect(): Expected parameter 1 to be an array,并返回 null。不是静默失败,也不是返回空数组。
立即学习“PHP免费学习笔记(深入)”;
- 务必在调用前用
is_array()做校验,尤其参数来自函数返回值或用户输入 - 常见坑:把
json_decode($str)结果直接喂给array_intersect,忘了加第二个参数true(否则返回对象) - 传入
null或字符串,也会触发警告 —— 别依赖“好像能跑通”,它只是碰巧把字符串转成单元素数组再比较
真正麻烦的不是语法,而是你默认它“智能识别数据结构”。它只认数组、只比值、只信第一个数组的键。一旦数据来源混了对象、JSON、空响应、类型松散的接口字段,结果就容易漏掉本该命中的项,或者多出意外匹配。



















