rsort()直接降序排序原数组且转数值比较,会丢失关联数组键名;保留键名需用arsort(),复杂规则则用uasort()自定义逆序逻辑。

PHP里用 rsort() 对数组降序排序
直接改原数组,不返回新数组,数值会被转成整型再比大小。比如 rsort($arr) 后,$arr 就是逆序的了。
常见错误:对关联数组用 rsort() 会丢键名——它只保索引,键值映射全没了。真要保留键名,得换函数。
- 数值数组(如
[3, 1, 4])→ 用rsort()最快最直白 - 字符串数组(如
['banana', 'apple'])→ 默认按字典序逆序,没问题 - 想保持键值关系?换成
arsort(),它按值逆序但保留键名
关联数组逆序且保留键名,用 arsort()
arsort() 是专门为此设计的:按值从大到小排,键名跟着动。比如 ['a' => 5, 'b' => 2] 经它处理后变成 ['a' => 5, 'b' => 2](已逆序),不是 [5, 2] 那种空键数组。
注意它默认用 SORT_REGULAR 比较,遇到字符串数字混合(如 ['x' => '10', 'y' => 2])可能出人意料——'10' 当字符串比 2 大,结果和数值比较不一致。
- 强制数值比较:加参数
arsort($arr, SORT_NUMERIC) - 区分大小写字符串比较:用
SORT_STRING(默认就是这个) - 忽略大小写?PHP没内置,得用
uasort()自定义回调
自定义规则逆序,绕不开 uasort()
当排序逻辑超出内置选项(比如按对象属性、多字段、中文拼音),uasort() 是唯一可靠选择。它不预设规则,全靠你写回调函数返回 -1 / 0 / 1。
关键点:回调里必须显式写逆序逻辑。比如想按字符串长度逆序,不能写 strlen($a) (那是升序),得写 <code>strlen($b) - strlen($a) 或 return -strcmp($a, $b)。
- 回调函数名可单独定义,也可用匿名函数:
uasort($arr, function($a, $b) { return $b['score'] - $a['score']; }) - 别漏掉
return,否则 PHP 7.4+ 会警告,排序结果不可靠 - 性能比
arsort()差一截,大数据量时留意
数字字符串排序容易错,SORT_NATURAL 得手动开
像 ['img10.png', 'img2.png', 'img1.png'] 这类,用默认排序会得到 ['img1.png', 'img10.png', 'img2.png'](因为字符串比 '10'
解决办法是加标志位:rsort($arr, SORT_NATURAL | SORT_FLAG_CASE),或者关联版 arsort($arr, SORT_NATURAL | SORT_FLAG_CASE)。注意 SORT_NATURAL 在 PHP 5.4+ 才有,老环境得自己实现自然排序逻辑。
-
SORT_FLAG_CASE必须和SORT_STRING或SORT_NATURAL搭配用,单独写无效 - Windows 下文件名大小写不敏感,Linux 敏感,跨平台排序前先统一转小写更稳妥
实际项目里,多数情况用 rsort() 或 arsort() 就够了,但只要涉及混合类型、自然序或特殊规则,就得立刻想到标志位和回调——漏掉一个参数,排序结果就可能完全反直觉。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











