普通数组排序首选sort()或rsort(),但会重置键为0起始整数索引;需保留键时应使用asort()或ksort()。

直接说结论:普通数组(即索引数组,键为数字且连续或不连续)用 sort() 升序、rsort() 降序最简单;但要注意它会重置键名,原键全丢,变成从 0 开始的整数索引。
什么时候该用 sort() 而不是 asort()
当你确认数组是纯数值索引、且排序后不需要保留原始键(比如 [2 => 'a', 0 => 'b', 5 => 'c'] 这种“伪关联”结构),就用 sort()。它快、直白、无副作用——除了重置键。
常见错误现象:asort() 被误用于索引数组,结果看似正常,但实际多做了键关联维护,性能略低,还可能掩盖键类型混淆问题。
-
sort()和rsort()只认值,不看键;asort()和arsort()是为关联数组设计的,哪怕你传个索引数组进去,它也会强行“保持键值关联”,导致行为冗余 - 如果数组里混了字符串和数字(如
[1, '2', 3.5]),默认按SORT_REGULAR比较,可能出人意料;加SORT_NUMERIC参数可强制转数字比 -
sort($arr, SORT_STRING)会把所有元素当字符串比,'10'会排在'2'前面——这是字符串字典序,不是数值大小
usort() 什么时候必须上,又容易踩什么坑
当你需要按自定义逻辑排,比如按字符串长度、按对象属性、或实现“数字优先+字母后置”这种混合规则,就得用 usort()。
立即学习“PHP免费学习笔记(深入)”;
但它有硬约束:回调函数必须返回整数(-1、0、1),返回浮点数(如 strlen($a) - strlen($b) 结果是 0.0)会被截成 0,导致所有元素被判定“相等”,顺序错乱。
- 安全写法是显式用三元或
船只运算符:return strlen($a) strlen($b); -
usort()总是重置键名为0,1,2...,哪怕你传的是[10=>'x', 20=>'y'],排完只剩[0=>'y', 1=>'x'] - PHP 8.0+ 中,相等元素的相对顺序是稳定的(会保持原顺序),但低于 8.0 的版本不保证——线上环境要查清楚版本
排序后键名消失?别慌,先确认你真需要它
普通数组排序后键名没了,不是 bug,是设计如此。如果你发现“排序后 foreach 出来的键不对”,大概率是你本就不该用普通数组存那种数据。
典型误用场景:用数字键存 ID 映射(如 [123 => 'userA', 456 => 'userB']),却当成普通数组调 sort()——这本质是关联数组,该用 asort() 或 uasort()。
- 判断依据很简单:用
array_keys($arr)看一眼,如果键里有非数字或非连续整数,就别碰sort() - 如果确实要保留键又想按值排,
asort()是正确选择;要按键排,用ksort() - 对二维数组按子项某个字段排,
usort()是主力,但记得回调里加空值防护,比如?? 0防止$a['score']不存在时报 notice
真正容易被忽略的点是:PHP 不区分“索引数组”和“关联数组”的底层类型,只看键是否全为连续数字。你手动设了 $arr[5] = 'x',它就不再是“普通数组”了,sort() 仍能跑,但语义已错。别依赖自动识别,自己盯紧键。



















