php 7.5 中 asort() 对中文数组乱序的根本原因是默认按字节比较,需显式使用 sort_locale_string 并正确设置中文 locale(如 zh_cn.utf-8),否则退化为字节序;拼音排序需借助第三方库生成拼音键后 uasort。

PHP 7.5 中用 asort() 对含中文的关联数组排序时出现乱序,根本原因不是函数本身不支持中文,而是默认按字节比较(SORT_REGULAR),而中文 UTF-8 字节序列无法直接按 ASCII 规则排序。要让中文按拼音或字典序正确升序排列,必须显式指定区域设置(locale)并启用字符串比较模式。
确保系统已安装中文 locale
PHP 的 SORT_LOCALE_STRING 依赖操作系统的 locale 支持。先确认服务器是否启用中文 locale:
- Linux 下运行:
locale -a | grep -i zh,应看到类似zh_CN.UTF-8或zh_TW.UTF-8 - 若无结果,需安装:Ubuntu/Debian 执行
sudo apt-get install language-pack-zh-hans,再运行sudo locale-gen zh_CN.UTF-8 - Windows 环境下 PHP 通常默认支持,但建议仍用
setlocale(LC_COLLATE, 'Chinese')测试
调用 asort 时传入 SORT_LOCALE_STRING 标志
不能只靠 setlocale() 全局设置,asort() 必须显式使用 SORT_LOCALE_STRING 才会触发 locale 比较逻辑:
$data = ['张三' => 85, '李四' => 92, '王五' => 78]; setlocale(LC_COLLATE, 'zh_CN.UTF-8'); // 必须匹配系统实际可用 locale asort($data, SORT_LOCALE_STRING); // 输出顺序将按汉字 Unicode 排序(非拼音),接近字典序
注意:SORT_LOCALE_STRING 按当前 locale 的 collation 规则排序,对简体中文通常是 Unicode 码点顺序(如「啊」
如需按拼音首字排序,需预处理键名
PHP 原生 asort 不提供拼音排序。稳妥做法是:先用第三方库(如 overtrue/pinyin)把中文键转为拼音,再排序:
- 安装:
composer require overtrue/pinyin - 代码示例:
use Overtrue\Pinyin\Pinyin;
$pinyin = new Pinyin();
$original = ['北京' => 100, '上海' => 95, '广州' => 88];
// 构造拼音映射数组
$withPinyin = [];
foreach ($original as $key => $val) {
$py = $pinyin->permalink($key); // 返回小写拼音,如 'bei-jing'
$withPinyin[$py] = [$key => $val]; // 临时键为拼音
}
uasort($withPinyin, function($a, $b) {
return strcmp(key($a), key($b));
});
$result = [];
foreach ($withPinyin as $group) {
$result[key($group)] = current($group);
}
避免常见陷阱
以下操作会导致 locale 排序失效:
- 没调用
setlocale(LC_COLLATE, ...)就直接用SORT_LOCALE_STRING—— 此时退化为普通字节比较 - 传入的 locale 名称拼写错误(如
zh_CN.utf8缺少大写或点号),setlocale()返回false却未检查 - 数组值为数字但键是中文,误用
SORT_NUMERIC—— 它只影响值比较,且对中文键无效 - PHP 运行在 CGI/FastCGI 模式下,
setlocale()可能被重置,建议每次排序前重新设置
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











