关联数组排序用asort()/arsort()保留键名,数值索引数组用sort()/rsort();多字段排序array_multisort()需传引用;sort()默认字符串排序,数字须加SORT_NUMERIC标志。

sort() 和 asort() 什么时候该用哪个
直接看效果:sort() 重排值、丢掉原键名;asort() 重排值、保留键名对应关系。别一上来就用 sort(),尤其当数组是关联的(比如 ['name' => 'Alice', 'age' => 30]),用了 sort() 键名全变数字索引,数据语义就断了。
常见错误现象:sort() 后 foreach ($arr as $key => $val) 里 $key 不再是 'name' 或 'email',而是 0、1……查了半天发现是排序函数选错了。
- 数值索引数组(纯列表)→ 用
sort()或rsort() - 关联数组(带语义键名)→ 必须用
asort()(升序)或arsort()(降序) - 想按键名排?不是按值——那就该用
ksort()/krsort()
uasort() 自定义排序总报 Warning: usort(): Array was modified by the user comparison function
这个警告不是因为你写错了比较逻辑,而是你在回调函数里直接改了传入的参数(比如对 $a 或 $b 赋值、调用引用操作)。PHP 的用户比较函数必须是纯函数:只返回 -1 / 0 / 1,不读写外部变量,更不能修改形参本身。
使用场景:按嵌套字段排(如 ['user' => ['score' => 85]])、按中文拼音、按日期字符串等内置函数搞不定的情况。
立即学习“PHP免费学习笔记(深入)”;
正确写法示例:
uasort($users, function($a, $b) {
return $a['score'] <=> $b['score']; // ✅ 安全
});
错误写法示例:
uasort($users, function($a, $b) {
$a['score']++; // ❌ 修改了 $a,触发警告
return $a['score'] <=> $b['score'];
});
array_multisort() 多字段排序容易漏掉引用参数
它本身不返回新数组,而是直接修改第一个参数。但关键陷阱在:**所有要参与排序的列数组,都必须以引用方式传入**,否则排序会静默失败(数组不变,也不报错)。
典型使用场景:从数据库查出二维数组,想先按 status 升序,再按 created_at 降序。
- 必须用
&$col1、&$col2传参,不能只对第一个加& -
SORT_ASC/SORT_DESC要和每个列一一对应,顺序不能错 - 性能上比多次
usort()略优,但可读性差,小数据量没必要硬上
简短示例:
$status = array_column($data, 'status'); $created = array_column($data, 'created_at'); array_multisort($status, SORT_ASC, $created, SORT_DESC, $data); // ❌ 这样不行
正确写法:
$status = array_column($data, 'status'); $created = array_column($data, 'created_at'); array_multisort($status, SORT_ASC, $created, SORT_DESC, $data); // ✅ PHP 7.4+ 允许,但老版本必须加 &
更稳妥(兼容旧版):
array_multisort($status, SORT_ASC, $created, SORT_DESC, &$data);
sort() 默认按字符串排序,数字会出事
sort() 默认行为是 SORT_REGULAR,但它对数字字符串(如 ['10', '2', '100'])实际走的是字典序,结果是 ['10', '100', '2'] ——不是你想要的数值大小顺序。
解决方法很简单:显式指定排序标志。
- 纯数字数组 → 用
sort($arr, SORT_NUMERIC) - 含数字的字符串数组(如 ID 字段)→ 用
sort($arr, SORT_STRING | SORT_FLAG_CASE)或更稳的usort()配intval() - 不确定类型时,别依赖默认,一律写明标志位
示例对比:
$arr = ['10', '2', '100']; sort($arr); // ['10', '100', '2'] sort($arr, SORT_NUMERIC); // ['2', '10', '100']PHP 数组排序真正麻烦的不是函数记不住,而是每次都要下意识问一句:“这个数组的键有没有业务含义?”“里面混没混字符串和数字?”“排序后还要不要用原键名取值?”——漏问一次,后面 debug 就得半小时。











