php数组交集本质是找出多个数组共同存在的元素;手写实现用哈希表预存首个数组值,遍历其余数组判断存在性,时间复杂度o(m+n),空间复杂度o(m)。

PHP 数组交集的核心逻辑
数组交集本质是找出多个数组中**共同存在的元素**。PHP 内置的 array_intersect() 已高度优化,但面试常要求手写实现,考察对数据结构、边界处理和时间复杂度的理解。
基础手写实现(支持两个数组)
用哈希表(PHP 关联数组)预存第一个数组的值,再遍历第二个数组判断是否存在——时间复杂度 O(m+n),空间 O(m):
function my_array_intersect($arr1, $arr2) {
if (empty($arr1) || empty($arr2)) return [];
$map = array_flip($arr1); // 值 → 键,快速查找
$result = [];
foreach ($arr2 as $val) {
if (isset($map[$val])) {
$result[] = $val;
unset($map[$val]); // 避免重复添加(保留首次出现顺序)
}
}
return $result;
}
支持多数组的通用版本
从第一个数组开始,逐轮与后续数组求交,每次结果作为下一轮的基准:
function my_array_intersect_multi(...$arrays) {
if (empty($arrays)) return [];
$result = $arrays[0];
for ($i = 1; $i < count($arrays); $i++) {
$next = $arrays[$i];
if (empty($result) || empty($next)) {
$result = [];
break;
}
$map = array_flip($next);
$temp = [];
foreach ($result as $val) {
if (isset($map[$val])) {
$temp[] = $val;
unset($map[$val]);
}
}
$result = $temp;
}
return $result;
}
关键细节与面试加分点
-
键名不保留:内置函数返回原第一个数组的键名,手写若需兼容,改用
$result[key($arr1)] = $val并维护键映射 -
类型严格比较:内置函数默认松散比较(
1 == '1'),如需严格,用===判断并配合array_keys($arr, $val, true) -
大数组优化:始终以最小数组建哈希表,减少空间占用;可用
count()预判并交换参数顺序 -
引用传递避免复制:对超大数组,用
&$arr接收可省内存(需说明适用场景)











