因为sort()默认按字符串字典序排序,“10”首位字符“1”小于“2”,故排在前面;需用intl扩展的collator类开启数字排序,或接受纯php无可靠通用方案。

PHP 里 sort() 为什么排 "10" 在 "2" 前面?
因为默认是字符串字典序排序:"10" 成立(比较首字符 <code>"1" 和 "2"),所以 ["10", "2", "1"] 排完是 ["1", "10", "2"]。这不是你想要的“自然顺序”——人类直觉里的数字大小顺序。
natcasesort() 和 natsort() 怎么选?
两者都按自然顺序排序,区别只在大小写处理:
-
natsort():区分大小写,"Z"排在"a"后面(ASCII 规则) -
natcasesort():忽略大小写,"Z"和"z"视为等价,更接近日常文件名排序习惯
大多数场景用 natcasesort() 更安全。注意:它们都直接修改原数组,并保持键名关联(即不会重排键索引)。
对关联数组排序,还要保持键值对应?
用 natcasesort() 或 natsort() 就行——它们专为关联数组设计。但如果你需要按值自然排序、同时按升序/降序控制方向,得组合使用:
- 升序自然排序(保持键名):
natcasesort($arr) - 降序自然排序(需额外一步):
natcasesort($arr); $arr = array_reverse($arr, true);
别用 rsort() 或 arsort() 替代,它们不支持自然排序逻辑,会退回字典序。
中文或混合字符串怎么自然排序?
natsort() 对纯中文无效,它只识别 ASCII 数字和字母。比如 ["文件10.txt", "文件2.txt"] 能正确排序;但 ["第10章", "第2章"] 会卡在“第”字上,结果不可靠。
真正要支持中文、Unicode 字符的自然排序,必须用 Collator 类(ICU 扩展):
$coll = new Collator('zh_CN');
$coll->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$coll->asort($arr); // 注意:这是按值排序且重排数字键
缺点是:需要服务器启用 intl 扩展;asort() 不保持原始键顺序(若需保持,得自己封装映射逻辑)。纯 PHP 不依赖扩展的方案目前不存在可靠通用解。
自然排序看着简单,实际踩坑点集中在:是否保留键名、中英文混排的支持边界、以及降序时容易误用普通反向函数。用错一个函数,排序结果就悄悄偏离预期。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











