ksort()按键ASCII升序原地排序关联数组,默认区分大小写且仅支持字符串和数字键;降序用krsort();中文键需Collator扩展;不修改原数组需手动重建。

用 ksort() 直接按键升序排序
PHP 关联数组的键是无序的,但 ksort() 会原地修改数组,按键的 ASCII 字符顺序(即字典序)升序排列。它默认区分大小写,且只支持字符串和数字键——混合键类型时数字键会被转为字符串再比较。
常见错误:对已排序的数组反复调用 ksort() 没问题,但若想降序,不能加负号或用 rsort(),得换函数。
-
ksort($arr)—— 升序,修改原数组 -
ksort($arr, SORT_STRING)—— 显式指定字符串比较(默认行为) -
ksort($arr, SORT_NATURAL)—— 启用自然排序,"item10"排在"item2"后面 - 不要传引用
&$arr:函数本身已按引用操作,加&反而可能触发严格模式警告
按键降序用 krsort()
krsort() 是 ksort() 的反向版本,语义清晰、性能一致,不推荐用 ksort() + array_reverse() 组合——后者会重置键名,破坏关联性。
典型误用场景:想让键为日期字符串的数组按时间倒序(如 "2024-03-01" → "2024-02-28"),直接 krsort($arr) 就行,因为 ISO 格式字符串的字典序与时间序一致。
立即学习“PHP免费学习笔记(深入)”;
-
krsort($arr)—— 降序,保留键值对关系 - 若键含前导零(如
"001","010"),SORT_NATURAL更安全,否则"010" < "02"(字符串比较) - 对浮点数键(如
3.14 => 'pi')慎用:ksort()会将其转为字符串,精度可能丢失
不修改原数组时用 array_keys() + array_replace() 手动重建
当需要保持原数组不变,又不想用 ksort() 的副作用时,得绕一下。核心思路是:提取键→排序→按新键序取出值。
注意点:PHP 7.4+ 支持箭头函数可简化,但低版本需用 create_function() 或普通回调;另外 array_combine() 对空数组或键值数量不等会报 warning。
-
$sorted_keys = array_keys($arr); sort($sorted_keys); $result = array_replace(array_flip($sorted_keys), $arr);—— 不推荐,array_replace()行为易混淆 - 更稳写法:
$keys = array_keys($arr); sort($keys); $result = []; foreach ($keys as $k) { $result[$k] = $arr[$k]; } - 如果键是整型且稀疏(如
[100 => 'a', 1 => 'b']),sort()会重索引,此时必须用asort()配合array_keys()提取后再映射
中文键名排序要用 collator 扩展
内置 ksort() 按字节排序,中文键如 ["北京" => 1, "上海" => 2] 会乱序(UTF-8 多字节导致)。必须启用 intl 扩展,用 Collator 类。
没装扩展时直接 new Collator() 会 fatal error;即使装了,不同系统 ICU 版本对中文排序规则支持程度也不同,测试时务必用真实数据验证。
-
$collator = new Collator('zh_CN'); $collator->asort($arr);—— 注意是asort()方法,不是函数 - 若返回 false,检查
$collator->getErrorCode(),常见原因是区域设置不被支持 - 替代方案(无扩展时):用
iconv('UTF-8', 'GBK//IGNORE', $key)转码后排序,但 GBK 编码顺序≠汉语拼音序,仅作粗略分组
Collator 或重构键命名成本就高了。



















