💡

[PHP,Laravel]ランキングの順位をつける

2023/03/01に公開

はじめに

1〜5位までのランキングの順位をつける時に苦戦をしたので、そのやり方を解説します。

仕様

countが大きい順に並んである配列に対して、1〜5位までの順位をつけます。
countの値が同じだった場合は、同じ順位になり、次の順位が繰り越されます。

//順位をつける前
[
  ["count" => 5],
  ["count" => 4],
  ["count" => 4],
  ["count" => 2],
  ["count" => 1],
]

//順位をつけた後(2位が同率となって次の順位が繰り越される)
[
  ["count" => 5,"rank"=>1],
  ["count" => 4,"rank"=>2],
  ["count" => 4,"rank"=>2],
  ["count" => 2,"rank"=>4],
  ["count" => 1,"rank"=>5],
]

ランキングに順位をつける

ランキングは通常通りに$rankに保存し、forが1回まわるごとに1位分上がります。
同率があった場合、$ranUpCountという変数に何個同率順位があったかを保存し、同率が終わった時のループで、同率があった個数分順位を以前から上げれ流ことにより実装できました。

$sortData //countのデータの入った配列
$ranking = []; //ランキング保存ようの配列
$rank = 1; //現在の順位
$rankUpCount = 1; //同一順位があり、次の順位をどれだけ上げるかの値

foreach ($sortData as $key => $data) {
    //ランキングは5位までとる
    if ($rank > 5) {
        break;
    }

    //ランクを加えてデータを挿入
    $ranking[] = [
     "count"=>$data["count"],
     "rank"=>$rank
    ];

//配列の末尾ではなく、次のcountと同じだったら順位を上げず、違ったら上げなかった分の順位を上げる
        if (isset($sortData[$key + 1]) && $data["count"]===$sortData[$key + 1]["count"]) {
        //countが同じだったら
        $rankUpCount++;
    } else {
        //countが違ったら
        if ($rankUpCount === 1) {
            $rank++;
        } else {
            //countが同じデータの連続が終わったら、次の順をデータが連続した分、上げる
            $rank = $rank + $rankUpCount;
            $rankUpCount = 1;
        }
    }
}

最後に

最近、今回実装したコードを再度見た時にすぐに理解できずに理解するのに少し時間がかかってしまったので、
他にもっと簡潔に書ける方法があったら教えていただきたいです。

前回の反省から、今回コードを再度見た時にすぐに理解できなかったので、コードにかなりコメントを残したので、次の時の理解はもっと早くできそうです。

Discussion