array_intersect系列函数用于计算多个数组交集:array_intersect按值松散比较并保留首数组键名;array_intersect_assoc要求键值均严格匹配;array_intersect_key仅按键名严格比较。

array_intersect 系列函数用于计算多个数组的交集,即找出所有数组中都存在的值。它们不比较键名,只比对值,并保留第一个数组的键名和键值对应关系。
array_intersect:基础交集(值比较,保留原键)
最常用的一个,按值比较,返回第一个数组中在其他所有数组里也都出现过的元素,键名不变。
- 参数:至少两个数组,第一个数组决定返回结果的键名
- 值比较使用松散比较(==),字符串 "1" 和整数 1 被视为相等
- 重复值会被保留(若第一个数组中有重复,结果中也保留)
示例:
$a = ['a' => 1, 'b' => '1', 'c' => 2]; $b = [1, 2, 3]; $c = ['x' => 1, 'y' => 2]; print_r(array_intersect($a, $b, $c)); // 输出:Array ( [a] => 1 [c] => 2 ) —— 键名来自 $a,值 1 和 2 同时存在于 $b 和 $c 中
array_intersect_assoc:键值同时匹配
不仅要求值相同,还要求键名也一致。适合处理结构化数据(如表单字段、配置项)。
立即学习“PHP免费学习笔记(深入)”;
- 键名和值都必须完全匹配(键名区分类型,字符串 "0" ≠ 整数 0)
- 同样以第一个数组为基准,只返回它里面“键+值”在其余数组中都存在的项
示例:
$a = ['name' => 'Tom', 'age' => 25, 'city' => 'Beijing']; $b = ['name' => 'Tom', 'age' => 25, 'job' => 'Dev']; $c = ['name' => 'Tom', 'age' => 25]; print_r(array_intersect_assoc($a, $b, $c)); // 输出:Array ( [name] => Tom [age] => 25 )
array_intersect_key:仅按键名取交集
忽略值的内容,只看键名是否在所有数组中都存在。返回第一个数组中那些键名被其他数组“共同拥有”的元素。
- 键名比较是严格比较(===),类型和值都要一致
- 值可以完全不同,只要键名存在就保留
示例:
$a = ['name' => 'Tom', 'age' => 25, 'email' => 't@x.com']; $b = ['name' => 'Jack', 'age' => 30, 'phone' => '123']; $c = ['name' => '', 'age' => null]; print_r(array_intersect_key($a, $b, $c)); // 输出:Array ( [name] => Tom [age] => 25 ) —— 只因 'name' 和 'age' 是三者共有的键
其他变体:带类型安全与自定义比较
PHP 还提供更严格的版本:
- array_intersect_uassoc:键名 + 值都比较,但允许传入用户自定义的键名比较函数
- array_intersect_ukey:仅键名交集,但用自定义函数比较键名(比如忽略大小写)
- array_intersect_values 不是内置函数——注意别混淆;真正严格类型比较需用 array_intersect 配合 array_map('strval', ...) 或提前统一类型
提示:如果需要严格比较(如 "1" ≠ 1),建议先用 array_map('strval', $arr) 或 array_map('intval', $arr) 统一类型再调用 array_intersect。











