rsort()仅适用于纯索引数组降序排序,会重置键名为0,1,2…;关联数组应使用arsort(),中文需sort_locale_string配合setlocale,数字字符串需sort_numeric。

直接用 rsort() 就能对索引数组做降序排序,但选错函数或忽略参数会导致键名丢失、中文乱序、数字当字符串比等意外结果。
rsort() 只适用于纯索引数组
它会把所有键重置为数字索引(0, 1, 2…),原始键名(尤其是字符串键)会被丢弃。如果你传入的是关联数组,比如 ['name' => 'Alice', 'score' => 95],rsort() 会强行把它当索引数组处理,结果只剩值,键全没了。
- ✅ 正确场景:数值列表
$list = [42, 7, 101, 3],排序后要按大小倒排,不关心原始下标 - ❌ 错误场景:用户ID映射分数
$scores = ['u1001' => 88, 'u1002' => 92],这时该用arsort() - ⚠️ 常见错误现象:
print_r($arr)显示键变成[0] => xxx,但代码里还试图用$arr['id']访问
sort_flags 参数决定中文和数字怎么比
默认用 SORT_REGULAR,也就是按 PHP 默认类型规则比——数字就当数字,字符串就按 ASCII 码比。这对中文基本无效,因为汉字的 ASCII 值不反映字典序。
- 中文降序:加
SORT_LOCALE_STRING,并提前调用setlocale(LC_COLLATE, 'zh_CN.UTF-8')(注意系统是否支持该 locale) - 数字字符串当数字比:比如
['10', '2', '100'],想得到['100', '10', '2'],必须传SORT_NUMERIC - 自然排序(如 v1.10 > v1.2):用
SORT_NATURAL | SORT_FLAG_CASE组合,避免'v10' 这种错误 - 不加参数时,
rsort(['10', '2'])实际按字符串比,结果是['2', '10']—— 这常被当成 bug
rsort() 和 arsort() 别混用
两者都降序,但行为完全不同:rsort() 是“只看值、扔掉键、重编号”,arsort() 是“按值排、键跟着走、关系不丢”。它们连返回值语义都不一样:rsort() 返回布尔值(成功/失败),arsort() 自 PHP 8.2 起固定返回 true。
- 传索引数组给
arsort()不报错,但排序后键变成[0] => x, [1] => y,看起来像rsort(),其实内部逻辑不同,性能略低 - 传关联数组给
rsort()后再用key()或array_keys(),拿不到原始键名,容易引发后续逻辑空指针 - 调试时快速判断:排序后
var_dump(array_keys($arr)),如果是纯数字且从 0 开始 → 很可能误用了rsort()
真正麻烦的不是语法写错,而是排序后键名被静默重置,而业务代码又隐式依赖了旧键结构——这种问题往往在线上跑了一周才暴露。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











