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 中键名也在
array_intersect_key() 缩小范围,再 array_intersect() 筛值0、1 会被 PHP 自动转成整型,比对时容易出意外in_array()
手动遍历时用 in_array() 在大数组里查值,时间复杂度是 O(n×m),很容易卡住。更优解是先把第二个数组用 array_flip() 转成键值互换的哈希表,再用 isset() 判断——后者接近 O(1)。
$b_keys = array_flip($b); $result = array_filter($a, fn($v) => isset($b_keys[$v]));null、对象的数组需额外判断,因为 array_flip() 会丢弃重复值和非法键交集逻辑看着简单,但键名保留、类型安全、性能边界这三点,随便漏一个就可能在线上吐异常或返回空数组。实际用时先盯紧数据类型和规模,再选函数。