array_intersect不支持多维数组和自定义比较,需用array_uintersect(配回调+一维化)、array_filter(手动深度比对)或序列化方案实现,核心是先明确定义“相等”逻辑。

array_intersect 本身不支持多维数组直接比较,也不接受自定义比较规则——它只对一维数组的值做松散字符串转换后全等判断((string)$a === (string)$b),且无法递归处理子数组。
如果你需要对多维数组求交集,并控制“相等”的逻辑(比如按某个字段匹配、忽略大小写、允许浮点误差、或深度比较结构),就得绕过 array_intersect,改用更灵活的方式。
✅ 正确做法:用 array_uintersect + 自定义回调(适用于值为标量或可序列化结构)
array_uintersect 允许你传入一个回调函数,用于严格定义两个元素是否“相等”。但它要求所有输入数组是一维的。所以关键一步是:先将多维数组扁平化或提取出可比特征。
例如,有用户数据数组:
立即学习“PHP免费学习笔记(深入)”;
$users1 = [
['id' => 1, 'name' => 'Alice', 'score' => 95.5],
['id' => 2, 'name' => 'Bob', 'score' => 87.0],
];
$users2 = [
['id' => 1, 'name' => 'alice', 'score' => 95],
['id' => 3, 'name' => 'Charlie', 'score' => 92],
];你想按 id 匹配(忽略 name 大小写、score 小数差异),可以这样:
$keys1 = array_map(fn($u) => $u['id'], $users1);
$keys2 = array_map(fn($u) => $u['id'], $users2);
// 用 array_uintersect 比较 id,但返回原始数组项
$result = array_uintersect(
$users1,
$users2,
fn($a, $b) => $a['id'] <=> $b['id'] // PHP 7.4+ 箭头函数
);⚠️ 注意:array_uintersect 要求数组元素能被回调函数两两比较,且必须返回整数(-1/0/1)。上面例子成立的前提是:你确保两个数组的结构一致、键存在、且 id 可安全比较。
✅ 更通用方案:用 array_filter + in_array 或自定义查找
当结构复杂、需深度比对(如整个子数组内容一致)、或要保留原始键名时,推荐手动遍历:
$common = [];
foreach ($users1 as $k => $u1) {
foreach ($users2 as $u2) {
if ($u1['id'] == $u2['id']
&& strcasecmp($u1['name'], $u2['name']) === 0
&& abs($u1['score'] - $u2['score']) < 1.0) {
$common[$k] = $u1; // 保留 $users1 的键
break;
}
}
}优点:逻辑完全可控;缺点:时间复杂度 O(n×m),大数据量时注意性能。
✅ 多维数组序列化后比较(简单但有局限)
如果子数组结构固定、且你信任 serialize() 行为(注意浮点精度、键顺序、对象不可序列化等问题),可临时转成字符串再交集:
$ser1 = array_map('serialize', $users1);
$ser2 = array_map('serialize', $users2);
$serInter = array_intersect($ser1, $ser2);
$result = array_map('unserialize', $serInter);⚠️ 风险:serialize 对键顺序敏感;关联数组若键顺序不同,即使内容相同也会判为不等;含资源、闭包、对象时会失败。
✅ 替代函数参考(按需求选)
| 需求 | 推荐函数 | 说明 |
|---|---|---|
| 比较键名 + 键值,且键名需自定义规则(如忽略大小写) | array_intersect_uassoc |
回调只管键名比较,值仍用 ===
|
| 比较键名,完全自定义(如正则匹配键) | array_intersect_ukey |
回调比较键名,值照搬第一个数组 |
| 值比较需自定义,且数组已是一维 | array_uintersect |
最常用,回调决定值是否相等 |
| 纯键名交集(不管值) | array_intersect_key |
快、轻量,适合字段白名单过滤 |
不复杂但容易忽略:PHP 没有原生“多维数组交集”函数,所有“高级交集”都靠组合基础函数 + 显式逻辑实现。关键是先明确「什么算相同」,再选择映射、筛选或回调策略。



















