sort() 直接升序排序并重置键为0,1,2…;需数值排序用sort_numeric,降序用rsort();保键值对应选asort()/ksort();复杂逻辑用usort()(也重置键)。

用 sort() 直接升序排序索引数组
对纯数字或字符串组成的索引数组(即键为 0,1,2… 的数组),sort() 是最直接的选择。它会重排值,并**重置键名**为从 0 开始的连续整数——这是它和 asort() 的核心区别。
常见错误是误以为 sort() 会保留原键,结果发现 print_r() 输出时键全变成 0,1,2…,导致后续用原键访问失败。
-
sort($arr)修改原数组,返回true(成功)或false(失败),不返回新数组 - 默认按字符串规则排序:
[10, 2, 1]会排成[1, 10, 2],不是数值大小顺序 - 要按数值排序,加第二个参数:
sort($arr, SORT_NUMERIC) - 要降序?用
rsort($arr, SORT_NUMERIC),别写sort($arr, SORT_DESC)——SORT_DESC不是sort()的合法标志
需要保持键值对应?用 asort() 或 ksort()
如果你的索引数组其实“假装”是关联数组(比如 [0 => 'c', 1 => 'a', 2 => 'b']),但又不能丢掉键,那就不能用 sort()。这时 asort() 按值排序、保键;ksort() 按键排序、保值。
典型场景:从数据库查出带 ID 的记录,ID 存在键里(如 [105 => 'apple', 23 => 'banana']),想按名称排序但还要能通过原 ID 访问。
-
asort($arr, SORT_STRING)—— 值按字符串升序,键不动 -
asort($arr, SORT_NATURAL)—— 自然排序,img2.jpg排在img10.jpg前面 -
ksort($arr)—— 键转成整数再排,所以[2 => 'x', 10 => 'y']排完还是[2 => 'x', 10 => 'y'](键本身已升序);但['10' => 'y', '2' => 'x']会变成['10' => 'y', '2' => 'x'](字符串键按字典序)
自定义排序逻辑?上 usort()
当排序规则复杂——比如按嵌套字段、多条件、中文拼音、或需调用外部函数——就得用 usort()。它不关心键,只重排值,且**强制重置键为 0,1,2…**,这点和 sort() 一致,但比它灵活得多。
容易踩的坑:回调函数必须返回整数( 0),不能只写 return $a (PHP 8+ 会警告,老版本可能行为异常)。
- 升序比较数字:
usort($arr, fn($a, $b) => $a - $b) - 按字符串长度升序:
usort($arr, fn($a, $b) => strlen($a) - strlen($b)) - 安全写法(避免溢出):
usort($arr, fn($a, $b) => $a $b)(宇航员操作符) - 如果原数组是对象数组,
$a->name和$b->name要确保属性存在,否则报Notice: Trying to access array offset on value of type null
性能与兼容性提醒
小数组(usort() 回调开销明显高于内置排序。PHP 7.4+ 对 fn() 箭头函数做了优化,仍略慢于 SORT_NUMERIC 这类 C 层实现。
-
sort()/rsort()最快,但丢键 -
asort()/ksort()比sort()略慢,因要维护键值映射 -
usort()最慢,尤其回调里做 heavy operation(如 DB 查询、文件读取) - PHP 8.1+ 开始,
sort()等函数对null元素更严格,含null的数组可能触发 warning,建议提前过滤
键是否重要,决定了你第一眼该看哪个函数——很多人卡住,其实是没先想清楚这点。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











