php数组排序函数选择取决于需求:sort重排值并丢键,asort保留键值关系按值排序,ksort按键名排序;三者均原地修改且返回布尔值。

PHP 数组排序函数选哪个?sort、asort、ksort 区别在哪
看需求定:要重排值且丢掉原键用 sort;要保留键值对应关系用 asort;要按键名排序用 ksort。三者都直接修改原数组,不返回新数组——这是最容易错的地方。
常见错误现象:print_r(sort($arr)) 打印出 1,因为 sort 返回布尔值,不是排序后的数组。
-
sort($arr):索引数组常用,排序后键变成 0,1,2…,原键名丢失 -
asort($arr):关联数组首选,值升序,键跟着动,['b'=>2, 'a'=>1]→['a'=>1, 'b'=>2] -
ksort($arr):按键名字符串升序,['z'=>1, 'a'=>2]→['a'=>2, 'z'=>1] - 所有函数默认按字符串规则比较,数字会被转成字符串排(
10 成立),要按数值排得加 <code>SORT_NUMERIC标志
怎么按数组内某个字段排序?比如用户数组按 age 升序
PHP 没有内置“按子键排序”,得靠 usort 配自定义比较函数。核心是:比较函数返回负数、0、正数,分别代表“小-等-大”。
容易踩的坑:忘记 return,或写成 $a['age'] > $b['age'](返回布尔值,不是整数),导致排序乱序。
立即学习“PHP免费学习笔记(深入)”;
- 必须用
usort($users, function($a, $b) { return $a['age'] $b['age']; }),飞船操作符是安全写法 - 如果 PHP 版本低于 7,改用
return $a['age'] - $b['age'](仅限整数)或return strcmp($a['name'], $b['name'])(字符串) -
usort会重置键名,如需保留原键,用uasort - 性能上,
usort比array_multisort更直观,但大数据量时后者略快(不过多数场景无感)
中文字符串排序乱码?sort 不支持 UTF-8
直接用 sort 排中文,结果是按字节序,不是按拼音或 Unicode 码点,所以“张”可能排在“啊”前面。
根本原因是 PHP 默认排序函数不走 locale,也不识别 UTF-8 编码边界。
- 临时方案:用
Collator类(ICU 扩展需开启),$coll = new Collator('zh_CN'); $coll->asort($arr) - 没扩展?转拼音再排:用第三方库(如
overtrue/pinyin)先把中文转成拼音字符串,再按拼音排序 - 别用
setlocale(LC_COLLATE, 'zh_CN.UTF-8')+strcoll搞usort,不同系统 locale 名不一致,线上环境极易失效 - 注意:
Collator的排序结果和微信/Excel 不完全一致,因底层规则不同,别硬对齐
多维数组排序后丢失结构?array_multisort 怎么用才不翻车
array_multisort 功能强但参数顺序反直觉:第一个参数是“排序依据列”,但它本身会被修改;后续参数才是被排序的数组。
典型翻车现场:array_multisort($ages, SORT_ASC, $users) —— 表面上想按 $ages 排 $users,但如果 $ages 和 $users 键不一致或长度不同,$users 可能被截断或补空。
- 确保用于排序的列(如
$ages)和目标数组(如$users)键完全一致、数量相同 - 推荐先提取列:
$ages = array_column($users, 'age');,再调用array_multisort($ages, SORT_ASC, $users) - 可链式多条件:
array_multisort($ages, SORT_DESC, $names, SORT_ASC, $users),优先级从左到右 - 它不支持闭包或复杂逻辑,真要按动态字段或表达式排序,老实用
usort
实际项目里,90% 的排序需求用对三个函数就覆盖了:简单值排用 sort/asort,按字段排用 usort,多列协同排用 array_multisort。中文排序和 locale 问题最容易在线上突然暴露,别等上线才发现。











