PHP排名功能错误:仅显示单个排名,寻求修复方案
修复PHP并列排名计算问题
原代码问题
原代码仅能输出单个排名,且未正确处理并列情况,核心问题有两个:
$numbers数组仅存入了单个平均分,无法处理多个数据的排名计算- 排名递增逻辑错误,并列分数未保持同一排名,也未跳过被占用的名次
原代码:
$avr = intval($result->markk / 11); $numbers = array($avr); rsort($numbers); $arr = $arr1 = array(); $i = $rank = 1; foreach ($numbers as $key => $value) { $arr[$value][] = $value; } foreach ($arr as $key => $value) { foreach ($value as $key1 => $value1) { echo $value1 . "- rank " . $rank . "<br>"; $rank++; // Increment the rank } $i++; }
修复后的代码
以下代码支持多数据的并列排名计算,比如输入分数数组[90, 85, 85, 80],会输出符合要求的并列排名:
// 收集所有用户的平均分到数组(替换成你的实际数据查询逻辑) $numbers = []; foreach ($results as $result) { $avr = intval($result->markk / 11); $numbers[] = $avr; } // 按分数降序排序 rsort($numbers); $rank = 1; $prevScore = null; foreach ($numbers as $index => $score) { // 当前分数与上一个不同时,更新排名为当前索引+1 if ($score !== $prevScore) { $rank = $index + 1; $prevScore = $score; } echo $score . "- rank " . $rank . "<br>"; }
关键逻辑说明
- 先将所有用户的平均分存入
$numbers数组,确保有足够数据进行排名计算 - 用
rsort()对分数降序排序,保证从高到低排列 - 遍历过程中通过
$prevScore记录上一个分数:- 遇到不同分数时,将排名设为当前索引+1(索引从0开始,直接对应实际名次)
- 相同分数保持当前排名不变,自动实现并列效果
- 该逻辑会自然跳过被并列占用的名次(比如两个第2名后,下一个直接是第4名)
示例输出
输入分数数组[90, 85, 85, 80],输出:
90- rank 1 85- rank 2 85- rank 2 80- rank 4
内容的提问来源于stack exchange,提问作者Leul Abetu
相关产品推荐
相关产品推荐

