array_unique在PHP 8.2中不支持对二维数组使用SORT_LOCALE_STRING去重,因其仅作用于一维数组,多维数组元素会被强制转为字符串"Array"导致全部误判为重复并返回原数组;需先用array_column提取字段,再对一维字段数组调用array_unique(..., SORT_LOCALE_STRING)配合array_intersect_key还原。

array_unique 在 PHP 8.2 中**不支持对二维数组直接使用 SORT_LOCALE_STRING(或任何 flags)去重**。该函数仅作用于一维数组的值,对多维数组无效——无论传入什么排序标志,它都无法正确比较嵌套结构。
为什么 SORT_LOCALE_STRING 对二维数组没用
array_unique 的 flags(包括 SORT_LOCALE_STRING)只影响“值如何被转换和比较”:它会把每个元素临时转成字符串,再按本地化规则做字典序比对。但二维数组的元素是数组本身,PHP 会将其统一转为字符串 "Array",所有行都变成相同字符串,结果就是:
- 触发警告(Warning: array_unique(): Array to string conversion)
- 返回原数组,未去重
- SORT_LOCALE_STRING 完全不生效
想按本地化规则去重二维数组?得手动提取+处理
如果你的真实需求是:**基于某些字段(如中文姓名、带重音的外文名)做本地化去重**,那必须先提取这些字段,再用 locale-aware 方式比对。例如:
- 用 array_column() 提取目标字段(如 name)
- 对这个一维字段数组调用 array_unique(..., SORT_LOCALE_STRING)
- 再用 array_intersect_key() 还原原始二维数组中对应行
代码示意:
立即学习“PHP免费学习笔记(深入)”;
注意:需提前设置好 locale(如 setlocale(LC_COLLATE, 'zh_CN.UTF-8'))$data = [
['id' => 1, 'name' => '张三'],
['id' => 2, 'name' => '張三'], // 繁体,本地化排序下可能视为等价
['id' => 3, 'name' => '李四']
];
setlocale(LC_COLLATE, 'zh_CN.UTF-8');
$names = array_column($data, 'name');
$unique_names = array_unique($names, SORT_LOCALE_STRING);
$keys = array_keys($unique_names); // 获取去重后保留的原始索引
$result = array_intersect_key($data, array_flip($keys));
更稳妥的做法:序列化 + 本地化哈希
若需严格按 locale 规则判断整行是否“语义重复”(比如忽略空格、全半角、大小写),推荐用 iconv() 或 intl 扩展标准化字符串,再生成签名:
- 对每行关键字段做 normalize(如用 Normalizer::normalize())
- 拼接后用 md5 或 sha1 生成哈希键
- 用哈希键去重,而非依赖 array_unique 的 flags
这样既绕过 array_unique 的维度限制,又真正实现 locale 感知的去重逻辑。



















