php实现并列排名
PHP实现并列排名的方法
并列排名是指当多个数据具有相同的值时,它们会被赋予相同的排名,而后续的排名会根据并列的数量进行跳过。以下是几种实现并列排名的PHP方法:

使用数组排序和循环
$scores = [100, 90, 90, 80, 75, 60, 60, 60, 30];
rsort($scores); // 降序排序
$rank = 1;
$ranks = [];
$previousScore = null;
foreach ($scores as $index => $score) {
if ($score !== $previousScore) {
$rank = $index + 1;
}
$ranks[$index] = $rank;
$previousScore = $score;
}
print_r($ranks);
使用array_count_values函数
$scores = [100, 90, 90, 80, 75, 60, 60, 60, 30];
rsort($scores); // 降序排序
$counts = array_count_values($scores);
$ranks = [];
$currentRank = 1;
foreach ($counts as $score => $count) {
$rankKeys = array_keys($scores, $score);
foreach ($rankKeys as $key) {
$ranks[$key] = $currentRank;
}
$currentRank += $count;
}
print_r($ranks);
使用数据库查询实现
如果数据存储在数据库中,可以使用SQL的窗口函数(MySQL 8.0+支持):
$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);
处理关联数组的情况
当需要保持数据与原始数组的关联时:
$students = [
['name' => 'Alice', 'score' => 100],
['name' => 'Bob', 'score' => 90],
['name' => 'Charlie', 'score' => 90],
['name' => 'David', 'score' => 80]
];
usort($students, function($a, $b) {
return $b['score'] - $a['score'];
});
$rank = 1;
$previousScore = null;
foreach ($students as &$student) {
if ($student['score'] !== $previousScore) {
$student['rank'] = $rank;
} else {
$student['rank'] = $rank - 1;
}
$previousScore = $student['score'];
$rank++;
}
print_r($students);
这些方法可以根据具体需求进行调整,适用于各种需要处理并列排名的场景。







