sort() 重置键名为数字索引,asort() 保持键值关联;两者均按值排序、支持相同 flags 参数控制比较方式,但 sort() 丢弃原键,asort() 保留原键,适用场景分别为索引数组和关联数组。

sort() 和 asort() 都是 PHP 的内置排序函数,但它们处理数组键的方式完全不同——**是否保留原始键名关联**,这是最核心、最常踩坑的差异点。
sort() 会重置键名为数字索引
sort() 只关心值的顺序,不关心键。无论你传入的是索引数组还是关联数组,它都会把键全部丢掉,重新用 0, 1, 2, ... 编号。
常见错误现象:['name' => 'Alice', 'age' => 30] 经 sort() 后变成 [0 => 30, 1 => 'Alice'],原始语义完全丢失。
适用场景:
- 纯数值或字符串组成的索引数组(如
$ids = [101, 99, 105]) - 你明确不需要保留键名,只关心值的排列顺序
- 后续要用
foreach ($arr as $val)简单遍历,不依赖键
asort() 保持键值关联不变
asort() 排序时只调整元素位置,但每个值仍牢牢绑定在原来的键上。这是处理关联数组(比如用户信息、配置项、映射表)的正确选择。
示例:
$scores = ['张三' => 87, '李四' => 92, '王五' => 76]; asort($scores); // 结果:['王五' => 76, '张三' => 87, '李四' => 92] —— 键没变,顺序按值升序
注意点:
- 它直接修改原数组,不返回新数组
- 返回布尔值(
true或false),不是排序后的数组 - 若需降序,用
arsort(),别试图asort($arr, SORT_DESC)——SORT_DESC不是合法 flag
flags 参数行为一致,但影响对象不同
两者都支持 $sort_flags 参数,比如 SORT_NUMERIC、SORT_STRING、SORT_NATURAL,但作用目标不同:
-
sort()的 flags 控制「值如何比较」,因为键已不存在 -
asort()的 flags 同样只控制「值如何比较」,和键无关;按键排序得用ksort()
容易混淆的点:asort($arr, SORT_STRING | SORT_FLAG_CASE) 是让值按忽略大小写的字符串规则排,不是让键忽略大小写。
性能与兼容性几乎无差别
底层都是 C 实现的快排变种,时间复杂度同为 O(n log n),实际性能差异可忽略。真正影响性能的是你传入的数据量和比较逻辑复杂度——如果需要自定义规则,就该换 usort(),而不是硬套 asort()。
PHP 5.3+ 全版本支持,无需担心兼容性。但要注意:如果数组里混了 null、对象、资源等不可比类型,asort() 可能静默失败或触发 warning,建议排序前先做类型过滤或使用 array_filter() 清理。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











