sort()和rsort()适用于纯数值或字符串数组的升序/降序排序,不保留键名;asort()/arsort()保留键名,适合关联数组;usort()/uasort()支持自定义规则;多维数组排序需注意键存在性及array_multisort()用法。

用 sort() 和 rsort() 做简单升序/降序
如果数组是纯数值或字符串,且你不需要保留键名(即索引会重排为 0,1,2…),sort() 和 rsort() 是最直接的选择。它们修改原数组,不返回新数组,返回值是布尔型,别误当成排序结果来用。
-
sort($arr)按值升序,字符串按字典序,数字按数值大小(但注意:若数组混有数字字符串如"10"和"2",默认仍按字符串比较,"10" < "2"成立) -
rsort($arr)降序,行为同上 - 想按数值大小比较混杂字符串数字?加
SORT_NUMERIC标志:sort($arr, SORT_NUMERIC)
保留键名就得用 asort() 和 arsort()
关联数组按值排序但要保留键值对应关系时,asort()(升序)和 arsort()(降序)是唯一正确入口。它们不会改动键名,只重排内部顺序。
- 常见错误:对关联数组误用
sort(),结果键名全丢,["a" => 3, "b" => 1]变成[0 => 1, 1 => 3] - 支持多种排序标志:
SORT_STRING、SORT_NUMERIC、SORT_NATURAL(自然排序,"img2.jpg"排在"img10.jpg"前) - 多维数组的子值?
asort()不适用——它只看第一层值,对象或数组会被转成Array字符串再比,结果不可控
自定义规则必须用 usort() 或 uasort()
当排序逻辑不能靠内置规则表达(比如按对象属性、按中文拼音、按嵌套字段、忽略大小写),就必须写回调函数,并选对函数:
- 索引数组 + 自定义逻辑 →
usort($arr, $callback)(键名重置) - 关联数组 + 自定义逻辑 →
uasort($arr, $callback)(保留键名) - 回调函数必须返回整数:
< 0表示第一个参数小,> 0表示第一个参数大,== 0表示相等 - 示例:按字符串长度升序:
uasort($arr, function($a, $b) { return strlen($a) - strlen($b); });
多维数组按某个字段排序的坑
这是高频出错场景。PHP 没有内置“按子键排序”,硬套 usort() 容易崩在键不存在或类型不一致上。
立即学习“PHP免费学习笔记(深入)”;
- 安全写法:在回调里先检查键是否存在,再处理类型,例如:
return ($a['score'] ?? 0) <=> ($b['score'] ?? 0);(PHP 7+ 船锚操作符) - 避免多次重复取字段:提前用
array_column()提取列,再用array_multisort()配合,性能更好且可读性强 - 注意
array_multisort($col, SORT_ASC, $arr)中,$col必须与$arr元素数量一致,否则静默失败或错位
实际项目里,80% 的排序需求落在 asort() 和 uasort() 上;真正容易翻车的是多维数组中没做键存在性判断,或者混淆了 sort() 和 asort() 的键名行为。



















