sort() 仅适用于纯索引数组,会重置键名为0、1、2…并丢失原始字符串键名;需保留键名时应选asort()或ksort(),且排序前须校验is_array($arr) && !empty($arr)。

直接说结论:用 sort() 就是给索引数组升序重排,原数组被改、键名全丢、不保关联——别拿它处理带字符串键的数组,否则会踩坑。
为什么 sort() 会清空原有键名
它专为纯索引数组(数字下标)设计,内部强制重置键为 0、1、2…。哪怕你传入的是 ['a' => 1, 'b' => 3],也会变成 [0 => 1, 1 => 3],原始键 'a'、'b' 彻底消失。
常见错误现象:
- 排序后
foreach ($arr as $key => $val)中的$key全是数字,和原始含义脱钩 - 后续用
$arr['user_id']访问时报Undefined index
正确场景只有一种:你确认数组是纯数值下标,且不需要保留任何语义化键名。
立即学习“PHP免费学习笔记(深入)”;
sort() 的 $flags 参数怎么选
默认按字符串比较(SORT_REGULAR),但实际数据类型常和预期不符。比如:
-
['10', '2', '1']默认排成['1', '10', '2'](字典序),要用SORT_NUMERIC -
['Apple', 'banana', 'Cherry']想忽略大小写,得用SORT_STRING | SORT_FLAG_CASE -
['img1.jpg', 'img10.jpg', 'img2.jpg']要自然顺序,必须上SORT_NATURAL
注意:SORT_LOCALE_STRING 依赖系统 locale 设置,线上环境容易不一致,慎用。
和 asort()、ksort() 到底该用谁
看你要保什么:
- 要按值排序 + 保留原始键名(比如
['name' => 'Alice', 'age' => 30]按 age 排)→ 用asort() - 要按键名排序(比如把
['z' => 1, 'a' => 2]按键变成['a' => 2, 'z' => 1])→ 用ksort() - 只要简单排数字列表或纯字符串列表,不care键 → 才轮到
sort()
性能上三者差别极小,别为了“快一点”硬用 sort() 去处理关联数组——修复键名错乱的成本远高于那几微秒。
返回值不是判断成功的依据
sort() 自 PHP 8.2 起固定返回 true,之前版本才返回 bool。所以别写 if (sort($arr) === false) 来容错。
真正要防的是传错类型:
- 传了
null或字符串?会触发 warning,函数不执行 - 传了对象?直接 fatal error
稳妥做法是排序前加一层判断:is_array($arr) && !empty($arr),而不是依赖返回值。
最易被忽略的一点:sort() 不做深拷贝,也不返回新数组。所有操作都落在原变量上,如果排序后还要用旧顺序,记得先 $old = $arr; 备份,别指望 array_values() 能救回来——它只帮你重索引,不还原原始键。



















