array_unique在php 8.2中无法直接去重二维数组,因其仅支持标量元素,对子数组会报错或误判为null;推荐用serialize+array_unique+unserialize组合实现,或手动遍历+in_array严格比较,亦可按指定键(如'id')结合array_column与array_intersect_key处理。

array_unique 在 PHP 8.2 中**无法直接去重二维数组**,因为它默认只支持一维数组(即元素为标量:string、int、float、bool),遇到子数组会报 Warning: array_unique(): Array not supported for second argument 或直接将所有子数组视为 NULL 导致逻辑错误。
为什么 array_unique 对二维数组无效
PHP 的 array_unique 内部基于“值的字符串哈希比较”,而数组不能被直接转为有意义的字符串用于去重。例如:
$arr = [[1, 'a'], [2, 'b'], [1, 'a']]; var_dump(array_unique($arr)); // PHP 8.2 中会警告,并可能返回意外结果(如仅保留第一个)
推荐方案:用 array\_map + serialize + array\_unique + array\_map + unserialize
这是最常用、兼容性好、逻辑清晰的方法——先序列化每个子数组为唯一字符串,去重后再反序列化还原:
- 对每个子数组调用 serialize() 转成不可变字符串
- 用 array_unique() 去除重复字符串
- 再用 unserialize() 恢复为原数组结构
$data = [[1, 'a'], [2, 'b'], [1, 'a'], [3, 'c']];
$unique = array_map('unserialize', array_unique(array_map('serialize', $data)));
// 结果:[[1,'a'], [2,'b'], [3,'c']]
更安全的替代:用循环 + in_array(适合小数据或需自定义比较)
如果担心 serialize/unserialize 的安全性(如含用户输入)或想按特定键去重,可用手动遍历:
- 初始化空结果数组
$unique = [] - 遍历原数组,用 in_array($item, $unique, true) 判断是否已存在(注意第三个参数
true启用严格比较) - 不存在则
[] = $item追加
$data = [[1, 'a'], [2, 'b'], [1, 'a']];
$unique = [];
foreach ($data as $item) {
if (!in_array($item, $unique, true)) {
$unique[] = $item;
}
}
按指定键去重(如只看 'id' 字段)
若二维数组是关联形式(如 [['id'=>1,'name'=>'A'], ['id'=>2], ['id'=>1]]),可用 array_column + array_keys + array_intersect_key:
- 提取所有
id值:$ids = array_column($data, 'id') - 获取首次出现的键:
$firstKeys = array_keys(array_unique($ids)) - 用这些键筛选原数组:
$unique = array_intersect_key($data, array_flip($firstKeys))
$data = [['id'=>1,'n'=>'A'], ['id'=>2,'n'=>'B'], ['id'=>1,'n'=>'C']]; $ids = array_column($data, 'id'); $unique = array_intersect_key($data, array_flip(array_keys(array_unique($ids)))); // 结果保留第一个 id=1 的项:[['id'=>1,'n'=>'A'], ['id'=>2,'n'=>'B']]
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











