选sort()丢键名、asort()保键名、ksort()按键名排;中文排序用Collator或strcoll();大数据量慎用uasort()。

PHP 数组排序函数选哪个?看键名还是看值
PHP 有七八个排序函数,初学者常卡在第一步:该用 sort() 还是 asort()?关键看两点:是否要保留原数组的键名、按值排序还是按键排序。
-
sort():只按值升序,**丢弃原始键名**,重排后键变成数字索引(0,1,2…) -
asort():按值升序,**保留原始键名**(适合关联数组) -
ksort():按键名升序(字符串键会按字母排,数字键转为字符串再比) -
usort()和uasort():需要自定义比较逻辑时才用,比如按对象属性或中文拼音排序
常见错误:sort() 后数组变空或顺序不对
最常踩的坑是直接对关联数组用 sort(),结果键名全丢了,还误以为“没排成功”。比如:
$arr = ['b' => 2, 'a' => 1, 'c' => 3]; sort($arr); print_r($arr); // 输出:Array ( [0] => 1 [1] => 2 [2] => 3 ) —— 键名 'b','a','c' 全没了
如果本意是保持键值对应关系,必须换用 asort():
$arr = ['b' => 2, 'a' => 1, 'c' => 3]; asort($arr); print_r($arr); // 输出:Array ( [a] => 1 [b] => 2 [c] => 3 )
- 别用
sort()处理带字符串键的数组,除非你明确要丢键 -
asort()和ksort()返回true,不返回新数组,是原地修改 - 所有排序函数默认升序;加
SORT_DESC参数可降序,如arsort($arr, SORT_DESC)
中文字符串排序怎么搞?别硬刚 strcmp
直接用 sort() 或 asort() 排中文,结果往往是乱序(因为底层按 ASCII 码比,而中文 UTF-8 编码高位字节大)。解决方法只有两个:
十天学会易语言图解教程用图解的方式对易语言的使用方法和操作技巧作了生动、系统的讲解。需要的朋友们可以下载看看吧!全书分十章,分十天讲完。 第一章是介绍易语言的安装,以及运行后的界面。同时介绍一个非常简单的小程序,以帮助用户入门学习。最后介绍编程的输入方法,以及一些初学者会遇到的常见问题。第二章将接触一些具体的问题,如怎样编写一个1+2等于几的程序,并了解变量的概念,变量的有效范围,数据类型等知识。其后,您将跟着本书,编写一个自己的MP3播放器,认识窗口、按钮、编辑框三个常用组件。以认识命令及事件子程序。第
立即学习“PHP免费学习笔记(深入)”;
- 用
collator扩展(推荐):$collator = new Collator('zh_CN'); $collator->asort($arr); - 没装扩展就用
uasort()+strcoll():uasort($arr, function($a, $b) { return strcoll($a, $b); }); - 注意:
strcoll()依赖系统 locale 设置,Linux 下通常需先执行setlocale(LC_COLLATE, 'zh_CN.UTF-8')
性能和兼容性提醒:小数组无所谓,大数组慎用 uasort
uasort() 每次比较都调用用户函数,PHP 7.4+ 里比内置排序慢 3–5 倍。10 万条数据以上,优先考虑预处理成数字索引再用 sort(),或者用数据库 ORDER BY。
- PHP 8.2 开始,
array_key_first()和array_key_last()能帮你快速定位排序后的首尾键,但排序本身还得靠上面几个函数 - Windows 下中文 locale 可能不生效,建议开发环境统一用 Linux 或 WSL
- 如果数组嵌套多维,得先用
array_column()提取字段,再配合array_multisort()—— 别一上来就写递归
排序本身不难,难的是想清楚“我要保什么、舍什么、按什么规则比”。键名要不要留、字符集是不是中文、数据量有多大——这三个问题没答清楚前,别急着敲第一个括号。










