PHP提供了丰富的数组排序函数,覆盖按值排序、按键排序、自定义规则排序等多种需求,开发者可以根据实际场景选择对应的函数实现数组有序化。

常用PHP数组排序函数分类
PHP的数组排序函数可以按照排序依据和处理键名的方式分为以下几类:
- 按数组值排序,保留原键名:
asort()、arsort() - 按数组值排序,重置数字键名:
sort()、rsort() - 按数组键名排序,保留键名关联:
ksort()、krsort() - 自定义规则排序:
usort()、uasort()、uksort() - 自然排序:
natsort()、natcasesort()
基础排序函数详解与场景
sort()和rsort():重置键名的值排序
sort()函数会按照升序对数组值进行排序,排序完成后会重置所有的数字键名,字符串键名会被丢弃。rsort()则是降序版本,同样会重置数字键名。
适用场景:索引数组需要按值升序或降序排列,不需要保留原键名关联的场景,比如商品销量列表排序、用户积分排名等。
<?php // 索引数组按值升序排序 $scoreList = [88, 92, 75, 100, 85]; sort($scoreList); print_r($scoreList); // 输出 Array ( [0] => 75 [1] => 85 [2] => 88 [3] => 92 [4] => 100 ) // 索引数组按值降序排序 rsort($scoreList); print_r($scoreList); // 输出 Array ( [0] => 100 [1] => 92 [2] => 88 [3] => 85 [4] => 75 ) ?>
asort()和arsort():保留键名的值排序
asort()按升序对数组值排序,同时保留键名和值的关联对应关系,arsort()是降序版本,同样保留键名关联。
适用场景:关联数组需要按值排序,同时需要保留键名对应关系的场景,比如用户ID和对应积分的数组排序,排序后还能通过用户ID找到对应积分。
<?php
// 关联数组按值升序排序,保留键名
$userScore = [
'user_1' => 88,
'user_2' => 92,
'user_3' => 75
];
asort($userScore);
print_r($userScore);
// 输出 Array ( [user_3] => 75 [user_1] => 88 [user_2] => 92 )
// 降序排序
arsort($userScore);
print_r($userScore);
// 输出 Array ( [user_2] => 92 [user_1] => 88 [user_3] => 75 )
?>
ksort()和krsort():按键名排序
ksort()按照键名的升序对数组排序,保留键名和值的关联,krsort()是键名降序版本。
适用场景:需要按照键名顺序处理数组的场景,比如按照日期作为键名的数组,需要按日期先后排序展示数据。
<?php
// 按日期键名升序排序
$dailyData = [
'2024-03-02' => 150,
'2024-03-01' => 120,
'2024-03-03' => 180
];
ksort($dailyData);
print_r($dailyData);
// 输出 Array ( [2024-03-01] => 120 [2024-03-02] => 150 [2024-03-03] => 180 )
// 键名降序排序
krsort($dailyData);
print_r($dailyData);
// 输出 Array ( [2024-03-03] => 180 [2024-03-02] => 150 [2024-03-01] => 120 )
?>
自定义与自然排序函数
usort()系列:自定义规则排序
当内置的排序规则无法满足需求时,可以使用usort()函数,它接收一个回调函数作为第二个参数,在回调函数中定义两个元素的比较规则。
适用场景:复杂排序规则,比如多维数组按照某个子元素排序、对象数组按照对象属性排序等。
回调函数的返回值规则:如果第一个参数小于第二个参数返回负数,等于返回0,大于返回正数。
<?php
// 多维数组按照年龄升序排序
$userList = [
['name' => '张三', 'age' => 25],
['name' => '李四', 'age' => 22],
['name' => '王五', 'age' => 28]
];
usort($userList, function($a, $b) {
return $a['age'] - $b['age'];
});
print_r($userList);
/*
输出:
Array (
[0] => Array ( [name] => 李四 [age] => 22 )
[1] => Array ( [name] => 张三 [age] => 25 )
[2] => Array ( [name] => 王五 [age] => 28 )
)
*/
?>
natsort()和natcasesort():自然排序
natsort()按照人类自然的认知方式对字符串值排序,比如会将img2.jpg排在img10.jpg前面,而普通排序会把img10.jpg排在img2.jpg前面。natcasesort()是自然排序的不区分大小写版本。
适用场景:文件名、带数字的字符串数组排序,需要符合人类阅读习惯的场景。
<?php $fileList = ['img10.jpg', 'img2.jpg', 'img1.jpg', 'img20.jpg']; // 普通sort排序 sort($fileList); print_r($fileList); // 输出 Array ( [0] => img1.jpg [1] => img10.jpg [2] => img2.jpg [3] => img20.jpg ) // 自然排序 natsort($fileList); print_r($fileList); // 输出 Array ( [2] => img1.jpg [1] => img2.jpg [0] => img10.jpg [3] => img20.jpg ) ?>
排序函数特性对比
以下是常用排序函数的核心特性对比:
| 函数名 | 排序依据 | 是否保留键名 | 排序方向 |
|---|---|---|---|
| sort() | 值 | 否,重置数字键 | 升序 |
| rsort() | 值 | 否,重置数字键 | 降序 |
| asort() | 值 | 是 | 升序 |
| arsort() | 值 | 是 | 降序 |
| ksort() | 键名 | 是 | 升序 |
| krsort() | 键名 | 是 | 降序 |
| usort() | 自定义规则 | 否,重置数字键 | 由回调决定 |
| natsort() | 值(自然规则) | 是 | 升序 |
使用注意事项
- 所有排序函数都会直接修改原数组,而不是返回新的排序数组,如果需要保留原数组,需要先拷贝数组再排序。
- 排序函数默认按照常规方式比较值,比如字符串比较是按字节比较,中文排序可能需要先设置地区或者使用自定义比较规则。
- 使用
usort()等自定义排序函数时,回调函数需要保证比较逻辑的一致性,避免出现不稳定的排序结果。
PHParray_sort数组排序usort修改时间:2026-06-16 14:27:43