arsort() 函数是PHP中用于对关联数组按照键值进行降序排序的重要函数。它在处理需要按值排序的关联数据时非常有用,如排行榜、价格排序等场景。
arsort() 函数对关联数组按照键值进行降序排序,同时保持键和值之间的关联。这意味着排序后,数组的键仍然指向相同的值。
arsort(array, sortingtype);
| 参数 | 描述 |
|---|---|
| array | 必需。规定要进行排序的数组。该参数通过引用传递,函数会直接修改原数组。 |
| sortingtype | 可选。规定如何比较数组的元素。可能的值:
|
演示如何使用 arsort() 对关联数组进行基本的降序排序。
<?php
// 创建关联数组
$fruits = array(
"apple" => 5,
"banana" => 2,
"orange" => 8,
"grape" => 3
);
echo "排序前的数组:";
print_r($fruits);
// 使用 arsort() 进行降序排序
arsort($fruits);
echo "排序后的数组:";
print_r($fruits);
// 输出结果:
// 排序前的数组: Array ( [apple] => 5 [banana] => 2 [orange] => 8 [grape] => 3 )
// 排序后的数组: Array ( [orange] => 8 [apple] => 5 [grape] => 3 [banana] => 2 )
?>
演示如何对包含字符串值的关联数组进行排序。
<?php
// 学生成绩数组
$grades = array(
"张三" => "优秀",
"李四" => "良好",
"王五" => "及格",
"赵六" => "优秀",
"钱七" => "中等"
);
echo "原始成绩:";
print_r($grades);
// 按成绩降序排序
arsort($grades);
echo "按成绩降序排序:";
print_r($grades);
// 输出结果会按照: 优秀, 中等, 良好, 及格的顺序排列
// 注意:中文字符串排序基于字符编码
?>
sortingtype 参数允许您指定比较元素的方式,这在处理不同类型的数据时非常重要。
<?php
// 包含数字字符串的数组
$numbers = array(
"a" => "10",
"b" => "2",
"c" => "25",
"d" => "100"
);
echo "原始数组:";
print_r($numbers);
// 使用 SORT_REGULAR (默认)
$arr1 = $numbers;
arsort($arr1, SORT_REGULAR);
echo "SORT_REGULAR 排序:";
print_r($arr1);
// 使用 SORT_NUMERIC
$arr2 = $numbers;
arsort($arr2, SORT_NUMERIC);
echo "SORT_NUMERIC 排序:";
print_r($arr2);
// 使用 SORT_STRING
$arr3 = $numbers;
arsort($arr3, SORT_STRING);
echo "SORT_STRING 排序:";
print_r($arr3);
// 输出说明:
// SORT_REGULAR: 按ASCII值比较 ["d"=>"100", "c"=>"25", "a"=>"10", "b"=>"2"]
// SORT_NUMERIC: 按数值比较 ["d"=>"100", "c"=>"25", "a"=>"10", "b"=>"2"]
// SORT_STRING: 按字符串比较 ["d"=>"100", "c"=>"25", "b"=>"2", "a"=>"10"]
?>
<?php
// 文件名称数组
$files = array(
"file1" => "image10.jpg",
"file2" => "image2.jpg",
"file3" => "Image1.jpg",
"file4" => "image20.jpg"
);
echo "原始文件数组:";
print_r($files);
// 普通字符串排序
$arr1 = $files;
arsort($arr1, SORT_STRING);
echo "普通字符串排序:";
print_r($arr1);
// 自然排序
$arr2 = $files;
arsort($arr2, SORT_NATURAL);
echo "自然排序:";
print_r($arr2);
// 不区分大小写的自然排序
$arr3 = $files;
arsort($arr3, SORT_NATURAL | SORT_FLAG_CASE);
echo "不区分大小写的自然排序:";
print_r($arr3);
// 输出说明:
// 普通排序: 按ASCII值 ["file4"=>"image20.jpg", "file1"=>"image10.jpg", "file3"=>"Image1.jpg", "file2"=>"image2.jpg"]
// 自然排序: 按人类可读顺序 ["file4"=>"image20.jpg", "file1"=>"image10.jpg", "file2"=>"image2.jpg", "file3"=>"Image1.jpg"]
// 不区分大小写自然排序: ["file4"=>"image20.jpg", "file1"=>"image10.jpg", "file2"=>"image2.jpg", "file3"=>"Image1.jpg"]
?>
<?php
// 商品价格数据
$products = array(
"笔记本电脑" => 5999,
"智能手机" => 3999,
"平板电脑" => 2999,
"智能手表" => 1299,
"耳机" => 599
);
echo "=== 商品价格排行榜 ===\n";
// 按价格降序排序
arsort($products);
// 显示排行榜
$rank = 1;
foreach($products as $product => $price) {
echo $rank . ". " . $product . " - ¥" . number_format($price) . "\n";
$rank++;
}
// 输出:
// 1. 笔记本电脑 - ¥5,999
// 2. 智能手机 - ¥3,999
// 3. 平板电脑 - ¥2,999
// 4. 智能手表 - ¥1,299
// 5. 耳机 - ¥599
?>
<?php
// 学生考试成绩
$scores = array(
"张三" => 85,
"李四" => 92,
"王五" => 78,
"赵六" => 96,
"钱七" => 88
);
echo "=== 学生成绩排名 ===\n";
// 备份原始数组用于显示详细信息
$original_scores = $scores;
// 按成绩降序排序
arsort($scores);
// 显示排名
$rank = 1;
foreach($scores as $name => $score) {
$percentage = ($score / 100) * 100;
echo "第" . $rank . "名: " . $name . " - " . $score . "分 (" . $percentage . "%)\n";
$rank++;
}
// 计算统计信息
$average = array_sum($original_scores) / count($original_scores);
$max_score = max($original_scores);
$min_score = min($original_scores);
echo "\n统计信息:\n";
echo "平均分: " . round($average, 2) . "\n";
echo "最高分: " . $max_score . "\n";
echo "最低分: " . $min_score . "\n";
echo "考试人数: " . count($original_scores) . "\n";
?>
<?php
// 网页访问量数据
$page_views = array(
"首页" => 12543,
"产品页" => 8765,
"关于我们" => 3421,
"联系我们" => 2987,
"博客" => 15674,
"帮助中心" => 5432
);
echo "=== 网页访问量排行榜 ===\n";
// 按访问量降序排序
arsort($page_views);
// 显示热门页面
$count = 1;
$total_views = array_sum($page_views);
foreach($page_views as $page => $views) {
$percentage = ($views / $total_views) * 100;
echo $count . ". " . $page . ": " . number_format($views) . " 次访问 (" . round($percentage, 1) . "%)\n";
$count++;
}
echo "\n总访问量: " . number_format($total_views) . " 次\n";
// 找出最受欢迎的页面
reset($page_views);
$most_popular = key($page_views);
echo "最受欢迎的页面: " . $most_popular . " (" . number_format($page_views[$most_popular]) . " 次访问)\n";
?>
| 返回值: | 如果成功则返回 TRUE,如果失败则返回 FALSE。 |
|---|---|
| PHP 版本: | 4+ |
| 更新日志: |
|
<?php
// 原始数据
$data = array(
"user1" => 100,
"user2" => 150,
"user3" => 100, // 与 user1 值相同
"user4" => 200
);
// 方法1: 直接排序(会修改原数组)
arsort($data);
echo "直接排序结果:";
print_r($data);
// 方法2: 备份后排序(推荐)
$backup_data = $data;
arsort($data);
echo "排序后数组:";
print_r($data);
echo "原始数组备份:";
print_r($backup_data);
// 方法3: 获取排序后的键名
$keys = array_keys($data);
arsort($data);
$sorted_keys = array_keys($data);
echo "排序后的键顺序:";
print_r($sorted_keys);
// 处理相同值的情况
$same_value_data = array(
"a" => 10,
"b" => 10,
"c" => 5,
"d" => 10
);
arsort($same_value_data);
echo "相同值排序结果(顺序不确定):";
print_r($same_value_data);
?>
<?php
$fruits = array(
"d" => "lemon",
"a" => "orange",
"b" => "banana",
"c" => "apple"
);
// 原始数组
echo "原始数组:";
print_r($fruits);
// arsort() - 按值降序,保持键值关联
$arsort_result = $fruits;
arsort($arsort_result);
echo "arsort() - 按值降序:";
print_r($arsort_result);
// asort() - 按值升序,保持键值关联
$asort_result = $fruits;
asort($asort_result);
echo "asort() - 按值升序:";
print_r($asort_result);
// krsort() - 按键降序,保持键值关联
$krsort_result = $fruits;
krsort($krsort_result);
echo "krsort() - 按键降序:";
print_r($krsort_result);
// ksort() - 按键升序,保持键值关联
$ksort_result = $fruits;
ksort($ksort_result);
echo "ksort() - 按键升序:";
print_r($ksort_result);
// rsort() - 按值降序,重建数字索引
$rsort_result = $fruits;
rsort($rsort_result);
echo "rsort() - 按值降序(重建索引):";
print_r($rsort_result);
?>