sort()用于数字索引数组,会丢失关联数组键名;asort()保持键值关联,适合关联数组按值排序;ksort()按键名排序但需注意类型混合问题。

sort()、asort()、ksort() 是最常被误用也最该先分清的三个函数——选错一个,轻则键名丢失,重则排序结果完全不符合预期。
按值排序却丢了键名?用 sort() 前先看数组类型
如果你传的是纯数字索引数组(比如 $list = [4, 2, 8]),sort() 完全没问题:升序、快、原地修改。
但一旦是关联数组(比如 $user = ['id' => 123, 'name' => 'Alice']),sort() 会直接把键名砍掉,变成 [0 => 'Alice', 1 => 123]——这不是排序,这是数据破坏。
- 只适用于一维、数字索引、不关心原始下标的场景
- 支持
$sorting_type参数,比如SORT_STRING强制当字符串比,SORT_NUMERIC避免"10" 这类字符串比较陷阱 -
rsort()就是它的降序镜像,行为一致,仅方向不同
关联数组按值排,必须用 asort() 或 arsort()
想按年龄给用户列表排序,又得保留 'Alice' => 30 这种映射关系?asort() 是唯一安全选择。
它不会动键名,只调整内部顺序。常见错误是拿 sort() 处理 $_POST 或数据库查出的关联结果,结果 key 全变数字,后续 $row['email'] 直接报 Undefined index。
-
asort()升序,arsort()降序,都保持键值关联 - 对中文、emoji 等 Unicode 字符,默认按字节比较,可能乱序;需配合
setlocale(LC_COLLATE, 'zh_CN.UTF-8')+SORT_LOCALE_STRING才可靠 - 性能略低于
sort(),但差异在万级数据内几乎不可测
按键名排序时,ksort() 的默认行为容易踩坑
ksort() 看似简单:按键名字母序排。但它默认用 SORT_REGULAR,意味着 '10' 和 10 会被当成不同类型处理,排序结果可能穿插。
例如:$arr = ['10' => 'ten', 1 => 'one', '2' => 'two'],直接 ksort($arr) 后,1(int)排最前,'10'(string)排最后——不是自然数序,而是类型混合导致的意外。
- 统一转为字符串键再调用
ksort($arr, SORT_STRING),或改用SORT_NATURAL处理含数字的键名 -
krsort()是它的降序版,逻辑相同 - 它不改变值,只重排键的物理位置;foreach 遍历时顺序即为排序后顺序
复杂结构排序别硬套内置函数,usort() 才是真解法
当你要按二维数组里某个字段排,比如 $users 按 ['profile']['score'] 升序,sort() 和 asort() 都无能为力。
usort() 接收回调,但注意:它会丢弃键名(返回索引数组)。如果需要保留键名,必须用 uasort();按键名自定义比较,则用 uksort()。
- 比较函数必须返回整数:负数($a 在 $b 前)、0(相等)、正数($a 在 $b 后)
- PHP 7+ 支持飞船操作符
,写return $a['score'] $b['score'];比手写 if-else 更安全 - 避免在回调里做耗时操作(如 DB 查询、文件读取),否则性能雪崩
sort() 当万能钥匙,一用就断链。记住:键名是否重要,是选函数的第一判断条件。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











