php多维数组不能直接用array_unique()去重,因其仅支持一维;推荐serialize+array_unique、in_array严格比较或按指定字段(如id/email)去重,均兼容中文、emoji等特殊字符。

PHP 7.2 中直接对含特殊字符(如中文、emoji、斜杠、引号、null 字节等)的二维数组去重,不能依赖 array_unique() 原生调用,因为它不支持多维比较。但特殊字符本身不是障碍——关键在于**比较逻辑是否能准确识别“内容相同”**。只要子数组结构一致、值可序列化,所有主流方法都适用,无需额外转义或过滤。
用 serialize + array_unique(最常用)
该方法把每个子数组转成字符串再去重,天然兼容任意 UTF-8 字符、emoji、标点甚至 HTML 实体(前提是没破坏数组结构)。注意:资源、闭包、匿名函数等不可序列化类型会报错,但普通含特殊字符的关联数组完全没问题。
- 写法简洁:
$unique = array_map('unserialize', array_unique(array_map('serialize', $arr))) - 保留原始键顺序(但数字键可能乱序),可用
array_values()重置索引 - 示例中
['name' => '小明 & 小红', 'desc' => "✅ 已完成!"]和重复项会被精准识别并去重
用 in_array 严格比较(兼容性最强)
不依赖序列化,直接用 PHP 全等(===)逐键逐值比对,对特殊字符零干扰,适合字段少、数据量不大的场景。
- 手动遍历 +
in_array($item, $result, true)判断是否存在 - 支持任意嵌套结构(只要子数组本身可比较),包括含 null、布尔、数字混合的值
- 性能随数组增大明显下降,1000 行以内推荐使用
按指定字段去重(如含 id/email 等唯一键)
若二维数组有稳定标识字段(例如 'uid'、'email'、'code'),可跳过全量比较,用键映射快速去重,速度最快且不受字符影响。
- 提取字段值:
$ids = array_column($arr, 'uid') - 去重并保留首个出现位置:
$unique_ids = array_keys(array_flip($ids)) - 重构结果:
$result = array_intersect_key($arr, array_flip($unique_ids)) - 即使
uid是"U_测试@2026!?"这类字符串,也能正确处理
注意事项与避坑点
特殊字符本身不会导致去重失败,但以下情况需主动处理:
- 前后空格或不可见字符(如
\t、\r\n、零宽空格)会导致“看起来一样却判为不同”——建议预处理:array_map(function($row) { return array_map('trim', $row); }, $arr) - 浮点数精度差异(如
1.0vs1)在严格比较下视为不同,必要时统一类型转换 - 避免用
implode(',')拼接去重——逗号若本身是数据内容(如['tag' => 'php,mysql']),会导致误判 - PHP 7.2 支持
SORT_REGULAR标志,但array_unique($arr, SORT_REGULAR)仍只对一维有效,二维无效,切勿误用
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











