array_intersect不能直接用于二维数组去重,因其仅支持一维标量数组;正确方式是用array_column+array_intersect_key按字段去重,或用serialize+array_unique实现全量内容去重。

array_intersect 本身不能直接用于二维数组去重,因为它只支持一维数组的值比较,且要求元素是标量(如字符串、数字)。在 PHP 7.4 中,对二维数组直接调用 array_intersect($arr, $arr) 会报错或返回空结果,因为子数组无法被作为“值”参与交集运算。
但你可以间接利用 array_intersect_key 配合其他函数,实现高效、安全的二维数组去重——这正是你问题中提到的 array_intersect 相关思路的正确落地方式。
✅ 推荐做法:用 array_column + array_intersect_key 去重(按指定字段)
适用于每项结构一致、有明确唯一标识字段(如 'id'、'email'、'name')的二维数组。
function arrayUniqueByField($array, $field) {
if (empty($array) || !is_string($field)) return $array;
// 提取该字段所有值(可能含重复)
$values = array_column($array, $field);
// 去重并保留首次出现的键(注意:array_unique 不改变键名)
$unique_values = array_unique($values);
// 用 array_intersect_key 保留原始数组中对应键的子数组
$result = array_intersect_key($array, $unique_values);
// 重置索引,确保返回连续数字键
return array_values($result);
}
示例:
$data = [
['id' => 1, 'name' => '李白'],
['id' => 2, 'name' => '杜甫'],
['id' => 1, 'name' => '李太白'], // id 重复 → 去掉
['id' => 3, 'name' => '王维'],
];
print_r(arrayUniqueByField($data, 'id'));
输出:
Array
(
[0] => Array ([id] => 1 [name] => 李白)
[1] => Array ([id] => 2 [name] => 杜甫)
[2] => Array ([id] => 3 [name] => 王维)
)
⚠️ 注意:此方法依据
$field的值去重,不校验整个子数组是否完全相同。若需全量内容去重,请选下方方案。
✅ 全数组内容去重(PHP 7.4 安全兼容)
使用 serialize + array_unique + unserialize 组合,PHP 7.4 完全支持,且比循环 in_array 更简洁高效:
function arrayUniqueFull($array) {
if (!is_array($array)) return $array;
// 序列化每个子数组 → 去重 → 反序列化
$serialized = array_map('serialize', $array);
$unique_ser = array_unique($serialized);
$result = array_map('unserialize', $unique_ser);
return array_values($result);
}
✅ 优点:
- 不依赖字段名,真正判断子数组结构、键名、顺序、值是否完全一致;
- PHP 7.4 中
serialize/unserialize对常规数组(不含资源、闭包、对象等)完全可靠; - 代码短,逻辑清晰。
❌ 注意:
- 若子数组含不可序列化类型(如
resource、匿名函数),会失败; - 大数据量时略有性能开销,但中小项目足够快。
❌ 为什么不能直接用 array_intersect?
-
array_intersect([['a'=>1]], [['a'=>1]])在 PHP 7.4 中会触发警告:array_intersect(): Expected parameter 1 to be an array, object given或直接返回空 —— 因为它内部尝试将数组当标量比较,失败后静默跳过; - 官方文档明确说明:
array_intersect()参数必须是一维数组,且元素为可哈希标量。
所以所谓“用 array_intersect 处理二维数组去重”,实际是误传;真正起作用的是 array_intersect_key(按键取交集),配合 array_column 构建逻辑键。
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











