array_unique在php 7.4中不支持多维数组去重,因其基于松散比较且子数组不可哈希;可靠方案是序列化→array_unique→反序列化,或按指定键(如id)遍历去重。

array_unique 在 PHP 7.4 中确实不支持直接处理多维数组——它会把每个子数组当作一个整体,但内部比较机制无法识别结构相同、顺序一致的子数组是否重复,最终可能返回原数组或触发警告。
为什么 array_unique 对多维数组无效
因为 array_unique 的比较基于 PHP 的“松散值比较”,而多维数组(如 ['id'=>1, 'name'=>'A'])在底层不是标量,无法直接哈希或比对。即使两个子数组内容完全一样,PHP 也认为它们是不同对象(除非用 SORT_REGULAR,但仍不可靠)。
例如:
$arr = [['a'=>1], ['a'=>1]];-
array_unique($arr)不去重,甚至可能报Warning: array_unique(): Array return type is not supported
可靠替代方案:序列化 + 去重 + 反序列化
这是最常用、兼容 PHP 7.4+ 的做法,原理是把每个子数组转成唯一字符串,再用 array_unique 处理字符串数组:
$multi = [['id'=>1,'name'=>'A'], ['id'=>2,'name'=>'B'], ['id'=>1,'name'=>'A']];
$unique = array_map('unserialize', array_unique(array_map('serialize', $multi)));
说明:
-
array_map('serialize', $multi):把每个子数组变成字符串(如a:2:{s:2:"id";i:1;s:4:"name";s:1:"A";}) -
array_unique(...):对这些字符串去重(字符串可比) -
array_map('unserialize', ...):还原为数组
⚠️ 注意:所有子数组内容必须可序列化(不能含资源、闭包、部分对象)。
按指定键精准去重(推荐用于数据表结构)
如果多维数组是类似数据库记录(如带 id 或 email 字段),更安全的做法是提取关键字段判断重复:
$seen = [];
$unique = [];
foreach ($multi as $item) {
$key = $item['id'] ?? null; // 或 $item['email']
if ($key !== null && !isset($seen[$key])) {
$seen[$key] = true;
$unique[] = $item;
}
}
优点:
- 不依赖序列化,性能更好
- 逻辑清晰,可扩展(比如加条件过滤)
- 避免因浮点数、NaN、空数组等导致的序列化歧义
需要保留原始键名?注意 array_values 干扰
上述两种方法默认生成数字索引。若原始数组有有意义的键(如 ['user_123' => [...], 'user_456' => [...]]),且你想保留它:
- 序列化方式:改用
foreach手动构建新数组,用serialize($item)作临时键 - 键值去重方式:直接用原始键作为
$seen的键,例如$seen[$item['id']] = $key;,最后用array_values($unique)或保持关联结构
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











