array_intersect() 默认松散比较(==),导致0=='0'等非预期结果;需用array_uintersect+严格三路比较函数或array_filter+in_array($item,$b,true)实现严格匹配。

PHP 中 array_intersect() 默认是**松散比较(==)**,即不严格检查类型。要实现**严格匹配(===)**——要求值相等且类型相同——不能直接用它,需手动处理或改用其他方式。
为什么 array_intersect 不严格?
它内部使用的是 PHP 的 == 比较,比如 0 == '0'、0 == false 都为 true,会导致非预期的交集结果。
用 array_uintersect + 自定义比较函数(推荐)
这是最直接、语义清晰的方式:用 array_uintersect() 并传入一个严格比较的回调函数(如 function($a, $b) { return $a === $b ? 0 : ($a > $b ? 1 : -1); })。
- 必须返回整数:0 表示相等,正数表示 $a > $b,负数表示 $a
- 注意:PHP 要求该函数满足“三路比较”逻辑,不能只返回 true/false
- 示例:
$a = [0, '0', false, 1];
$b = ['0', 1, 2];
$result = array_uintersect($a, $b, function($x, $y) {
return $x === $y ? 0 : ($x > $y ? 1 : -1);
});
// 结果:['0', 1] —— 只有字符串'0'和整数1同时存在于两数组且类型一致
用 array_filter + in_array(严格模式)
对第一个数组逐个判断是否在第二个数组中存在严格相等的元素:
- 使用
in_array($item, $array, true),第三个参数设为 true 启用严格比较 - 适合小到中等规模数组;大数组时性能略低于
array_uintersect(因每次调用都遍历) - 示例:
$a = [0, '0', false, 1];
$b = ['0', 1, 2];
$result = array_filter($a, function($item) use ($b) {
return in_array($item, $b, true);
});
$result = array_values($result); // 重置键名(可选)
// 结果:['0', 1]
提前转成统一类型再交集(慎用)
仅当业务允许且类型差异有明确映射规则时可用,例如全部转字符串或全部转整型:
- 用
array_map('strval', $arr)后再用array_intersect() - 但会丢失原始类型信息,比如
false和0都变'0',无法区分 - 不推荐用于需要保留类型语义的场景
不复杂但容易忽略:严格交集的关键在于比较逻辑,而不是交集函数本身。选 array_uintersect 配合三路比较函数,是最贴近原生风格又可靠的做法。











