You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP Laravel 已排序集合带并列排名功能实现问题排查

问题分析

你的代码逻辑存在明显缺陷,核心问题有2点:

  • 内层循环匹配到相同积分后对$score['rank']的赋值,会被外层最后一行的$score['rank'] = $key + 1直接覆盖,内层循环逻辑完全无效
  • 你声明的$duplicateScores集合自始至终没有写入任何数据,内层循环根本不会执行,整套逻辑等于没有生效

你当前得到的跳跃排名(两个第2名之后直接到第4名)是原始遍历索引+1的结果,和你写的并列判断逻辑没有任何关系。

实现方案

你需要的是稠密排名规则:积分相同排名一致,积分变化时排名仅+1,不会跳过中间位次。因为你已经提前对集合按积分倒序完成排序,直接遍历一次即可完成排名赋值,代码如下:

public function addRanks()
{
    $scores = $this->makeCollection();
    $previousScore = null;
    $currentRank = 0;

    foreach ($scores as $score) {
        // 积分发生变化时更新当前排名
        if ($score['score'] !== $previousScore) {
            $currentRank++;
        }
        $score['rank'] = $currentRank;
        $previousScore = $score['score'];
    }

    return $scores;
}

如果后续你需要生成跳跃排名(两个第2名之后直接到第4名,也就是竞争排名规则),可以用如下逻辑:

public function addRanks()
{
    $scores = $this->makeCollection();
    $previousScore = null;
    $currentRank = 0;
    $position = 0;

    foreach ($scores as $score) {
        $position++;
        if ($score['score'] !== $previousScore) {
            $currentRank = $position;
        }
        $score['rank'] = $currentRank;
        $previousScore = $score['score'];
    }

    return $scores;
}

内容的提问来源于stack exchange,提问作者chadriae

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 19:54:03