php实现并列排名
PHP实现并列排名的方法
实现并列排名通常涉及对数据进行排序,并为相同值的项分配相同的排名,同时跳过后续的排名位置。以下是几种实现方式:

使用数组和循环进行排名
$scores = [85, 90, 78, 90, 92, 85];
rsort($scores); // 降序排序
$rankings = [];
$rank = 1;
$previousScore = null;
foreach ($scores as $index => $score) {
if ($score !== $previousScore) {
$rank = $index + 1;
}
$rankings[$score][] = $rank;
$previousScore = $score;
}
print_r($rankings);
使用SQL查询实现并列排名
如果数据存储在数据库中,可以通过SQL直接计算并列排名:

SELECT score,
DENSE_RANK() OVER (ORDER BY score DESC) AS rank
FROM scores_table;
对应的PHP代码可能如下:
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->query('SELECT score, DENSE_RANK() OVER (ORDER BY score DESC) AS rank FROM scores_table');
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r($results);
使用自定义函数处理并列排名
function calculateRanks(array $scores): array {
arsort($scores); // 保持键值关联的降序排序
$ranks = [];
$rank = 1;
foreach ($scores as $key => $score) {
if (!isset($previousScore) || $score !== $previousScore) {
$rank = count($ranks) + 1;
}
$ranks[$key] = $rank;
$previousScore = $score;
}
return $ranks;
}
$scores = ['A' => 85, 'B' => 90, 'C' => 78, 'D' => 90, 'E' => 92, 'F' => 85];
$rankings = calculateRanks($scores);
print_r($rankings);
处理多维数组的排名
对于更复杂的数据结构,可能需要先提取排序字段:
$students = [
['name' => 'Alice', 'score' => 85],
['name' => 'Bob', 'score' => 90],
['name' => 'Charlie', 'score' => 78],
['name' => 'David', 'score' => 90],
['name' => 'Eve', 'score' => 92],
['name' => 'Frank', 'score' => 85]
];
usort($students, function($a, $b) {
return $b['score'] - $a['score'];
});
$rank = 1;
$previousScore = null;
foreach ($students as &$student) {
if ($student['score'] !== $previousScore) {
$rank = count($students) - (array_search($student, $students) + 1) + 1;
}
$student['rank'] = $rank;
$previousScore = $student['score'];
}
print_r($students);
注意事项
- 使用
DENSE_RANK()函数需要MySQL 8.0+或支持窗口函数的数据库版本 - 降序排序时注意使用
rsort()会重置数组索引,而arsort()保持键值关联 - 处理并列排名时,后续排名数字是否跳过取决于具体需求(如1,2,2,4或1,2,2,3)






