想按键名从小到大的顺序排数组?ksort()就是干这个的。它根据键名对关联数组进行升序排序,同时保持键和值的对应关系。
krsort()是降序,ksort()是升序——记住k前缀代表key(键名)。这个函数从PHP 4.0就有了。
语法格式
bool ksort(array &$array [, int $sort_flags = SORT_REGULAR]): bool
参数说明:
| 参数 | 说明 | 必填? |
|---|---|---|
| array | 要排序的数组(传引用,直接修改原数组) | 必填 |
| sort_flags | 排序行为标志 | 可选 |
sort_flags可选值:
| 标志 | 说明 |
|---|---|
| SORT_REGULAR | 默认,正常比较 |
| SORT_NUMERIC | 按数值比较 |
| SORT_STRING | 按字符串比较 |
| SORT_LOCALE_STRING | 基于当前区域设置比较 |
返回值: 成功返回true,失败返回false。
示例1:关联数组按键名升序
<?php
$student_scores = [
"code005" => 88,
"code002" => 92,
"code008" => 78,
"code001" => 85,
"code003" => 96
];
ksort($student_scores);
print_r($student_scores);
?>
输出:
Array
(
[code001] => 85
[code002] => 92
[code003] => 96
[code005] => 88
[code008] => 78
)
键名从小到大排列:code001 → code002 → code003 → code005 → code008。值是跟着键走的。
示例2:数字键名
<?php
$data = [
5 => "第五个",
1 => "第一个",
8 => "第八个",
3 => "第三个",
10 => "第十个"
];
ksort($data);
print_r($data);
?>
输出:
Array
(
[1] => 第一个
[3] => 第三个
[5] => 第五个
[8] => 第八个
[10] => 第十个
)
数字键名按数值大小升序排列。
示例3:字符串键名(字母顺序)
<?php
$countries = [
"china" => "北京",
"india" => "新德里",
"japan" => "东京",
"korea" => "首尔",
"usa" => "华盛顿"
];
ksort($countries);
print_r($countries);
?>
输出:
Array
(
[china] => 北京
[india] => 新德里
[japan] => 东京
[korea] => 首尔
[usa] => 华盛顿
)
字符串按字母顺序排列:china < india < japan < korea < usa。
示例4:大小写敏感问题
<?php
$mixed_case = [
"Apple" => "苹果",
"banana" => "香蕉",
"Cherry" => "樱桃",
"date" => "枣"
];
ksort($mixed_case);
print_r($mixed_case);
?>
输出:
Array
(
[Apple] => 苹果
[Cherry] => 樱桃
[banana] => 香蕉
[date] => 枣
)
大写字母开头的键名排在小写字母前面。因为大写字母的ASCII码(65-90)小于小写字母(97-122)。如果需要不区分大小写排序,可以先用array_change_key_case()统一转成小写或大写。
个人经验分享
-
ksort()和krsort()的区别
| 函数 | 顺序 | 典型用途 |
|---|---|---|
| ksort() | 升序(小→大) | 自然顺序展示 |
| krsort() | 降序(大→小) | 新/较大优先 |
-
和asort()系列的区别
-
asort()/arsort():按值排序 -
ksort()/krsort():按键名排序
选哪个取决于排序维度。
-
-
原数组会被直接修改
ksort()直接修改原数组,不返回新数组。需要保留原数组的话,先复制:$copy = $array; -
SORT_NUMERIC处理数字字符串键名
$versions = ["v10" => 10, "v2" => 2, "v1" => 1]; ksort($versions); // 字符串排序:"v1", "v10", "v2"(可能不是你想要的结果)如果键名是"v1"、"v2"、"v10"这样的格式,字符串排序会把"v10"排在"v2"前面。这时候需要提取数字部分,或者改用数值键名。
示例5:代码号学习编程场景
<?php
// 场景:按学生ID升序显示成绩(学号从小到大)
$exam_results = [
"code010" => 85,
"code002" => 92,
"code015" => 78,
"code001" => 88,
"code008" => 96,
"code020" => 75
];
// 按学号升序排序
ksort($exam_results);
echo "按学号升序的成绩表:\n";
foreach ($exam_results as $student_id => $score) {
echo "{$student_id}: {$score}分\n";
}
?>
输出:
按学号升序的成绩表:
code001: 88分
code002: 92分
code008: 96分
code010: 85分
code015: 78分
code020: 75分
示例6:SORT_STRING vs SORT_NUMERIC
<?php
$numeric_keys = [
10 => "十",
2 => "二",
20 => "二十",
1 => "一",
5 => "五"
];
// 默认(等同于SORT_STRING,因为键名是数字时会自动按数值)
ksort($numeric_keys);
echo "默认排序:\n";
print_r($numeric_keys);
// SORT_NUMERIC显式指定
ksort($numeric_keys, SORT_NUMERIC);
echo "\nSORT_NUMERIC排序:\n";
print_r($numeric_keys);
?>
数字键名时,默认行为就是数值排序,两种写法结果一样。
示例7:中文键名的排序
<?php
$chinese_keys = [
"张三" => 85,
"李四" => 92,
"王五" => 78,
"赵六" => 88
];
ksort($chinese_keys);
print_r($chinese_keys);
?>
中文键名的排序取决于字符编码。默认情况下按UTF-8字节顺序排序,结果可能不符合中文拼音顺序。如果需要按拼音排序,需要配合Collator类(PHP intl扩展)或其他方法。
示例8:索引数组的ksort
<?php
$index_array = ["香蕉", "苹果", "橙子", "葡萄", "西瓜"];
ksort($index_array);
print_r($index_array);
?>
输出:
Array
(
[0] => 香蕉
[1] => 苹果
[2] => 橙子
[3] => 葡萄
[4] => 西瓜
)
索引数组的键名是0,1,2,3...,ksort()排序后位置不变(本来就是升序)。所以对索引数组用ksort()没意义,用sort()/rsort()排值才对。
本节课程知识要点
-
ksort()按键名升序排序数组(小到大) -
保持键和值的关联关系
-
直接修改原数组,不返回新数组
-
SORT_NUMERIC、SORT_STRING等标志控制比较方式 -
主要用在关联数组上
-
和
krsort()功能相反(升序 vs 降序) -
从PHP 4.0开始可用