php 实现排名
PHP 实现排名的方法
使用数组排序实现简单排名
通过PHP内置的排序函数对数据进行处理,适用于基础排名需求。
$scores = [85, 92, 78, 95, 88];
rsort($scores); // 降序排序
$ranking = 1;
foreach ($scores as $score) {
echo "排名{$ranking}: 分数 {$score}\n";
$ranking++;
}
处理并列排名的实现
当出现相同分数时,采用并列排名方式,后续排名跳过相同数量的位置。
$data = [
['name' => '张三', 'score' => 95],
['name' => '李四', 'score' => 88],
['name' => '王五', 'score' => 95],
['name' => '赵六', 'score' => 82]
];
// 按分数降序排序
usort($data, function($a, $b) {
return $b['score'] - $a['score'];
});
$rank = 1;
$prevScore = null;
$skip = 0;
foreach ($data as $key => $item) {
if ($prevScore !== null && $item['score'] == $prevScore) {
$skip++;
} else {
$rank += $skip;
$skip = 0;
}
$data[$key]['rank'] = $rank;
$prevScore = $item['score'];
}
数据库查询实现排名
直接从数据库获取排序结果,适用于大数据量场景。
-- MySQL实现
SELECT
id,
name,
score,
FIND_IN_SET(score, (SELECT GROUP_CONCAT(score ORDER BY score DESC) FROM scores)) AS rank
FROM scores
ORDER BY score DESC;
// PHP+MySQL实现
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->query("
SELECT
id, name, score,
DENSE_RANK() OVER (ORDER BY score DESC) AS rank
FROM scores
ORDER BY score DESC
");
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
使用DENSE_RANK窗口函数
MySQL 8.0+支持窗口函数,可以更高效地计算排名。
$query = "
SELECT
id,
name,
score,
DENSE_RANK() OVER (ORDER BY score DESC) as rank
FROM students
";
$result = $pdo->query($query);
性能优化建议
对于大型数据集,建议在数据库层面完成排名计算。添加适当索引可显著提升查询性能:
ALTER TABLE scores ADD INDEX (score);
特殊排名场景处理
处理分组排名(如班级内排名)的实现方式:

$query = "
SELECT
class_id,
student_name,
score,
DENSE_RANK() OVER (PARTITION BY class_id ORDER BY score DESC) as class_rank
FROM student_scores
";






