首选 sort() 升序或 rsort() 降序;需数值排序时加 sort_numeric 标志,避免字符串比较错误;单数组排序勿用 array_multisort() 或 usort(),性能更优且语义清晰。

用 sort() 还是 rsort()?看升序还是降序
索引数组(即键为数字、从 0 开始连续的数组)按数字大小排序,首选 sort()(升序)或 rsort()(降序)。它们直接修改原数组,不保留原始键名——这是关键行为,不是 bug。
常见错误是误用 asort():它专为关联数组设计,会保留键值对关系,但对纯索引数组排序后,键会被重排成 0,1,2…,看似一样,实则掩盖了语义混淆。一旦数组里混入字符串数字(如 "10" 和 "2"),sort() 默认按字符串比较,结果变成 "10", "2"(字典序),而非数值意义上的 2, 10。
- 升序数字排序:用
sort($arr, SORT_NUMERIC) - 降序数字排序:用
rsort($arr, SORT_NUMERIC) - 避免默认行为:不传
flags参数时,sort()等价于SORT_REGULAR,对混合类型不可靠
array_multisort() 能不能用?能,但通常没必要
如果你只有一个索引数组要排序,array_multisort() 是大炮打蚊子。它真正价值在于多数组同步排序(比如姓名数组和分数数组保持一一对应),或者给多维数组按某列排序。
但有人会这么写:array_multisort($arr, SORT_ASC, SORT_NUMERIC)。语法合法,效果也等同于 sort($arr, SORT_NUMERIC),但多了一层间接调用,性能略低,且容易让人误以为在处理多维结构。
- 仅单数组排序 → 直接用
sort()或rsort() - 需要稳定排序(PHP 8.0+ 已默认稳定)或后续还要按另一维度二次排序 → 才考虑
array_multisort() - 注意:
array_multisort()会重置数字键,和sort()一样,别指望它保留原始索引
字符串数字怎么安全转成数值再排?
当数组元素是数字字符串(如 ["10", "2", "100"]),又不想用 SORT_NUMERIC(比如担心非数字字符串触发警告),就得先转换类型再排序。
最简方式是用 array_map('intval', $arr) 或 array_map(fn($x) => (int)$x, $arr),但注意这会新建数组;若必须原地修改,可配合 foreach 强制转换:
foreach ($arr as $k => $v) {
$arr[$k] = (int)$v;
}
sort($arr);
-
intval()截断小数,(int)强转更直接,两者都忽略非数字前缀(如"2abc"→2) - 若需严格校验(如拒绝
"abc"),得先用is_numeric()过滤或抛异常 - 别用
settype($arr[$k], 'integer')—— 它返回布尔值,不赋值
为什么 usort() 不推荐用于简单数字排序?
usort() 灵活,但代价明显:每次比较都调用用户函数,PHP 解释器开销大,尤其数组大时性能下降显著。对纯数字排序,内置函数已高度优化,usort() 没有优势。
典型错误写法:usort($arr, fn($a, $b) => $a $b)。看起来简洁,实际比 sort($arr, SORT_NUMERIC) 慢 3–5 倍(基准测试可见 PHP 8.2+ 文档)。
- 仅当排序逻辑复杂(如按绝对值、按模运算余数、带业务规则)才启用
usort() - 若坚持用,务必加类型提示或强制转换,避免
$a和$b是字符串导致飞船操作符()按字符串比较 -
usort()会重置键名,和sort()一致,这点常被忽略
sort() 的 SORT_NUMERIC 标志是在比较阶段做转换,而 array_map('intval', ...) 是在排序前批量转换。前者更省内存,后者更可控。选哪个,取决于你是否信任输入数据的“数字性”。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











