rsort直接修改原数组并返回布尔值,不返回新数组;默认按字符串排序导致数值结果错误,需加SORT_NUMERIC标志;关联数组会丢失键名,应改用arsort;对象数组须用usort自定义比较。

rsort 会直接修改原数组,不返回新数组
很多人以为 rsort 像 array_reverse 那样返回一个新数组,结果写成 $new = rsort($arr),发现 $new 是 bool(true),而原数组却已乱序——因为 rsort 是就地排序,只返回布尔值表示是否成功。
- 正确用法:直接调用
rsort($arr),之后用$arr就是降序结果 - 想保留原数组?先用
$copy = $arr复制(注意:PHP 7.4+ 中普通赋值是浅拷贝,对一维数值数组够用) - 若需链式调用或函数式风格,改用
array_reverse(sort($arr) ? $arr : $arr)不现实,应换思路:用usort($arr, fn($a, $b) => $b $a)
rsort 默认按字符串比较排序,数值可能出错
比如数组 [10, 2, 15, 1] 经 rsort 后变成 [2, 15, 10, 1]——这是按字符 ASCII 顺序排的:"2" > "15"。它不是 bug,是默认行为。
- 数值降序必须加标志位:
rsort($arr, SORT_NUMERIC) - 想按字符串长度降序?
rsort不支持,得用usort($arr, fn($a, $b) => strlen($b) strlen($a)) - 其他常用标志:
SORT_STRING(强制字符串比较)、SORT_REGULAR(默认,但类型混用时行为难预测)
关联数组用 rsort 会丢键名
如果你传入的是带字符串键的数组,比如 ['a' => 10, 'b' => 30, 'c' => 20],调用 rsort 后得到的是 [30, 20, 10],键全变成数字索引 0,1,2——因为 rsort 是“重置索引”的排序函数。
- 要保持键值对并按值降序,用
arsort($arr) -
arsort也支持SORT_NUMERIC等标志,用法一致:arsort($arr, SORT_NUMERIC) - 如果还要按键名降序,用
krsort($arr)
rsort 在对象数组上完全无效
对包含对象的数组(如 [$obj1, $obj2])直接调用 rsort,PHP 会尝试把对象转成字符串再比(通常是 "Object id #123"),结果不可控且无意义。
立即学习“PHP免费学习笔记(深入)”;
- 必须用
usort显式定义比较逻辑,例如按对象属性score降序:usort($objs, fn($a, $b) => $b->score $a->score) - 注意空值处理:如果
$b->score可能为null,会返回1(null小于任何数),需提前判断 - 性能上,
usort比rsort慢,但这是唯一可靠方式
rsort($arr, SORT_NUMERIC);带键?换 arsort;含对象或复杂规则?绕开 rsort,直奔 usort。最常被忽略的是那个 SORT_NUMERIC 标志——不加它,数字排序基本等于随机。



















