array_intersect()按值松散比较返回首数组中在其他数组均存在的元素并保留原键名;不支持多维数组,类型敏感需手动实现,性能优化可用array_flip()+isset()。

用 array_intersect() 获取两个数组的值交集
直接用 array_intersect() 就行,它按值比较,返回第一个数组中在其他所有数组里都存在的元素,键名保留原样。注意它不关心键名,只看值是否相等(松散比较)。
- 如果数组里有字符串
"1"和整数1,会被当作相同值处理 - 浮点数和整数也可能被误判相等,比如
1.0和1 - 多维数组不能直接用——
array_intersect()会把子数组当成Array字符串来比,结果永远为空
示例:
$a = ['a' => 1, 'b' => 2, 'c' => 3]; $b = [2, 3, 4]; $result = array_intersect($a, $b); // 返回 ['b' => 2, 'c' => 3]
要严格类型匹配?改用 array_intersect_assoc() 或手动遍历
array_intersect_assoc() 同时校验键名和值,但依然做松散比较。真要类型敏感(比如区分 1 和 "1"),得自己写循环或用 array_filter() 配合 in_array(..., ..., true)。
-
in_array(1, ["1", 2], true)返回false,因为开启严格模式后类型不同 - 用
array_filter($a, fn($v) => in_array($v, $b, true))可实现严格值交集 - 若还需保留原始键名,别用
array_values()重置,否则会丢键
筛选交集的同时保留键名对齐?试试 array_intersect_key()
当你要的是「键名相同且值也存在」的交集,而不是「值相同」,就得换函数。array_intersect_key() 只比键名,不管值内容;配合 array_intersect() 手动组合才能兼顾两者。
-
array_intersect_key($a, $b)返回 $a 中键名也在 $b 中出现的元素(值照搬,不校验值本身) - 想同时满足“键存在”+“值也存在”,得两步:先
array_intersect_key()缩小范围,再array_intersect()筛值 - 注意关联数组键名是字符串,数字键如
0、1会被 PHP 自动转成整型,比对时容易出意外
大数据量下性能明显变慢?避免嵌套 in_array()
手动遍历时用 in_array() 在大数组里查值,时间复杂度是 O(n×m),很容易卡住。更优解是先把第二个数组用 array_flip() 转成键值互换的哈希表,再用 isset() 判断——后者接近 O(1)。
立即学习“PHP免费学习笔记(深入)”;
$b_keys = array_flip($b); $result = array_filter($a, fn($v) => isset($b_keys[$v]));- 这招对字符串和整数最有效;含空值、
null、对象的数组需额外判断,因为array_flip()会丢弃重复值和非法键 - 如果 $b 本身键名有意义(比如是配置项 ID 列表),翻转前先确认没重复值,否则会静默丢失
交集逻辑看着简单,但键名保留、类型安全、性能边界这三点,随便漏一个就可能在线上吐异常或返回空数组。实际用时先盯紧数据类型和规模,再选函数。











