arsort() 按值降序排序并保留键名,适用于关联数组;rsort() 仅用于索引数组。它不返回新数组,不支持回调,$flags 参数需据数据类型选 sort_numeric 等,空数组需判空处理。

arsort() 直接修改原数组,按值降序排,同时保留键名 —— 这是它和 rsort() 最本质的区别。别拿它去排索引数组,否则键会乱;也别指望它返回新数组,它不生成副本。
什么时候该用 arsort() 而不是 rsort()
关键看数组有没有「有意义的键名」:
- 关联数组(比如
["user_123" => 98, "user_456" => 72])→ 用arsort(),否则排序后你找不到谁是谁 - 纯数字索引数组(比如
[98, 72, 85])→ 用rsort(),arsort()会把键变成字符串或打乱顺序,反而难处理 - 混合键(数字键 + 字符串键)→
arsort()仍可工作,但要注意 PHP 会把纯数字字符串键转为整型,可能意外合并项
arsort() 的 $flags 参数怎么选
默认按 SORT_REGULAR 比较,也就是“照原样比”——这在多数场景下反而出问题:
- 值是数字字符串(如
"10","2")却按字符串比 →"2" > "10",结果错乱 → 改用SORT_NUMERIC - 值含大小写混合的英文(如
"Apple","banana")→ 默认区分大小写,"Apple"可能排在"banana"后面 → 加SORT_FLAG_CASE | SORT_STRING - 值是带数字的文件名(如
"img2.jpg","img10.jpg")→ 普通字符串排序会得img10, img2→ 必须用SORT_NATURAL - 本地化排序(如中文拼音、德语变音)→ 需先
setlocale(LC_COLLATE, "de_DE.UTF-8"),再用SORT_LOCALE_STRING
排序后取最大值的键名,别用 key() 碰运气
arsort() 总是重置数组内部指针到第一个元素,所以 key($arr) 看似能取到最大值的键 —— 但前提是没其他代码中途调用过 next()、current() 或遍历过该数组:
- 安全做法:排序后立刻用
array_keys($arr)[0]显式取首个键 - 注意:PHP 8.0+ 保证相等值保持原有顺序,但如果你依赖“第一个出现的最大值”,就别在排序前改过数组结构
- 如果数组为空,
array_keys($arr)[0]会触发Undefined offset→ 先判空:!empty($arr) ? array_keys($arr)[0] : null
最常被忽略的一点:它不返回新数组,也不支持回调函数。想按嵌套字段(如 $users[$id]['score'])排序?得用 uasort() 配自定义比较器,arsort() 做不到。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











