sort()用于纯索引数组排序并重置键,asort()保留关联数组键值关系;usort()要求比较函数严格返回-1/0/1;natsort()专用于字符串自然排序,原地修改且不处理大小写。

sort() 和 usort() 是 PHP 排序的分水岭:前者解决 90% 的日常需求,后者才真正暴露你对排序逻辑的理解深度。别从冒泡排序开始学,先搞清内置函数怎么用、为什么这么设计。
什么时候该用 sort() 而不是 asort()
关键看数组有没有“有意义的键名”。sort() 会把 ["a" => "apple", "b" => "banana"] 的键全干掉,变成 [0 => "apple", 1 => "banana"];而 asort() 保留键值对关系,只按值排。
常见错误是拿关联数组直接丢给 sort(),结果调试时发现键名没了,数据对应关系断了。
适用场景:
- 纯索引数组(数字键,且不依赖键)
- 排序后只取值、不关心原始键名
- 后续要
array_values()重置键,那不如一开始就用sort()
usort() 的比较函数必须返回 -1、0、1
这是最常翻车的地方:usort() 不接受布尔值或任意整数,只认 -1(前者小)、0(相等)、1(前者大)。写成 return $a > $b 看似简洁,实际返回的是 true/false,PHP 会转成 1/0,导致排序错乱甚至死循环。
正确写法示例(升序):
usort($users, function($a, $b) {<br> return $a['age'] $b['age']; // PHP 7+ 太空船操作符,安全又直观<br>});
如果兼容老版本,手动判断:
return ($a['age'] $b['age']) ? 1 : 0);
注意:
usort() 会重置键,要保留键用 uasort();要按键名排序用 uksort()。
自然排序 natsort() 不是“更智能的 sort”,而是专治混合字符串
natsort() 解决的是 ["img1.png", "img10.png", "img2.png"] 这类数据——普通 sort() 会排成 img1.png, img10.png, img2.png(字典序),而 natsort() 输出 img1.png, img2.png, img10.png(数值感知)。
但它不处理大小写:"Apple" 和 "apple" 在 natsort() 下仍不等价,这时得换 natcasesort()。
陷阱:natsort() 返回布尔值,不是新数组;它原地修改并返回 true/false,别写成 $sorted = natsort($arr),那是错的。
另外,它只适用于字符串值;对数字数组用它反而可能出意外(比如把 100 当字符串比,和 sort() 行为不一致)。
手写排序算法只在两种情况下必要
一是教学理解(比如面试要求现场写快排),二是极端定制需求(如带权重的稳定排序、流式数据边插入边排序)。但生产环境几乎不需要:
-
usort()配合闭包已覆盖绝大多数自定义场景 - PHP 内置排序是 C 实现的,比 PHP 层手写快一个数量级以上
- 手写冒泡/选择排序在千级数据上就明显卡顿,且容易写错稳定性(
sort()不稳定,asort()稳定)
quickSort() 而非冒泡——前者平均 O(n log n),后者固定 O(n²),而且递归边界、pivot 选取、重复元素处理这些细节,一不留神就崩。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











