PHP内置的数组排序函数丰富,arsort和sort是其中使用频率较高的两个,两者都能实现数组元素的排序,但在排序逻辑和适用场景上有明显差异,理解这些差异能帮助开发者更精准地处理数组排序需求。

arsort和sort的核心区别
两个函数的基础功能都是对数组进行排序,但核心特性存在多个维度的不同,具体对比如下:
| 对比维度 | sort函数 | arsort函数 |
|---|---|---|
| 排序方向 | 升序排列(从小到大) | 降序排列(从大到小) |
| 键名处理 | 重新索引键名,原有键名会被丢弃 | 保留原有键名和值的对应关系 |
| 返回值 | 成功返回true,失败返回false | 成功返回true,失败返回false |
| 排序类型默认规则 | 默认按常规方式比较元素,可传第二个参数修改排序模式 | 默认按常规方式比较元素,可传第二个参数修改排序模式 |
函数基础用法说明
sort函数用法
sort函数会对数组进行升序排序,同时重置数组的键名为从0开始的数字索引,原有键名会全部丢失。函数语法为sort(array &$array, int $flags = SORT_REGULAR),第一个参数是待排序的数组,第二个参数是可选的排序模式参数。
以下是sort函数的使用示例:
<?php
// 定义一个关联数组
$score = array("math" => 85, "english" => 92, "chinese" => 88);
// 使用sort排序
$sortResult = sort($score);
// 输出排序结果和返回值
echo "sort排序后数组:";
print_r($score);
echo "sort返回值:" . ($sortResult ? "true" : "false");
?>
上述代码执行后,输出结果如下:
sort排序后数组:Array
(
[0] => 85
[1] => 88
[2] => 92
)
sort返回值:true
可以看到原有键名math、english、chinese被丢弃,数组被重新索引为0、1、2,元素按升序排列。
arsort函数用法
arsort函数会对数组进行降序排序,同时保留原有数组的键名和值的对应关系,不会重置键名。函数语法为arsort(array &$array, int $flags = SORT_REGULAR),参数含义和sort函数一致。
以下是arsort函数的使用示例:
<?php
// 定义一个关联数组
$score = array("math" => 85, "english" => 92, "chinese" => 88);
// 使用arsort排序
$arsortResult = arsort($score);
// 输出排序结果和返回值
echo "arsort排序后数组:";
print_r($score);
echo "arsort返回值:" . ($arsortResult ? "true" : "false");
?>
上述代码执行后,输出结果如下:
arsort排序后数组:Array
(
[english] => 92
[chinese] => 88
[math] => 85
)
arsort返回值:true
可以看到原有键名被完整保留,元素按降序排列,键名和值的对应关系没有发生变化。
适用场景分析
sort函数适用场景
当你需要得到一个升序排列的数组,并且不需要保留原有键名,或者原有数组本身就是索引数组(键名是连续数字)时,适合使用sort函数。比如处理用户提交的表单数组、从数据库查询出来的索引数组列表等场景。
示例场景:获取一组学生的分数列表,只需要按分数从低到高排列,不需要知道每个分数对应的科目:
<?php // 学生分数索引数组 $studentScores = [78, 92, 85, 69, 95]; sort($studentScores); echo "升序排列后的分数:"; print_r($studentScores); ?>
arsort函数适用场景
当你需要按值降序排列数组,同时需要保留键名和值的对应关系,也就是需要知道每个值对应的原始键名时,适合使用arsort函数。比如统计词频后按出现次数从高到低排列、商品销量按从高到低排列并保留商品ID等场景。
示例场景:统计不同商品的销量,按销量从高到低排列,同时保留商品名称:
<?php
// 商品销量关联数组,键名是商品名称,值是销量
$goodsSales = array("手机" => 120, "电脑" => 85, "平板" => 150, "耳机" => 200);
arsort($goodsSales);
echo "按销量降序排列的商品列表:";
print_r($goodsSales);
?>
注意事项
- 两个函数都是直接修改原数组,而不是返回一个新的排序后的数组,使用时要注意原数组会被覆盖。
- 如果需要升序且保留键名,可以使用
asort函数,它是arsort的升序版本。 - 排序模式参数
$flags可以选择SORT_REGULAR(默认,常规比较)、SORT_NUMERIC(数值比较)、SORT_STRING(字符串比较)等,根据实际数组元素类型选择合适的模式可以避免排序错误。
提示:如果数组元素包含混合类型,使用默认的SORT_REGULAR模式可能会出现不符合预期的排序结果,此时需要明确指定排序模式。