PHPでランキングの作り方【同順位(タイ)対応】

PHPでランキングを作成する方法をまとめました。

使用するサンプルの配列

配列データを元にしてランキングを作成しますので、今回はサンプルで下記のような配列を元に作成していきます。

$aryRanking = [];
$aryRanking[] = ['name' => '田中', 'point' => 100];
$aryRanking[] = ['name' => '山本', 'point' => 90];
$aryRanking[] = ['name' => '佐藤', 'point' => 90];
$aryRanking[] = ['name' => '真島', 'point' => 100];
$aryRanking[] = ['name' => '角田', 'point' => 80];
$aryRanking[] = ['name' => '山田', 'point' => 60];
$aryRanking[] = ['name' => '坂本', 'point' => 85];
$aryRanking[] = ['name' => '木村', 'point' => 95];
$aryRanking[] = ['name' => '細川', 'point' => 85];
$aryRanking[] = ['name' => '橋本', 'point' => 70];

print_rで展開するとこんな感じです。

Array
(
    [0] => Array
        (
            [name] => 田中
            [point] => 100
        )
    [1] => Array
        (
            [name] => 山本
            [point] => 90
        )
    [2] => Array
        (
            [name] => 佐藤
            [point] => 90
        )
    [3] => Array
        (
            [name] => 真島
            [point] => 100
        )
    [4] => Array
        (
            [name] => 角田
            [point] => 80
        )
    [5] => Array
        (
            [name] => 山田
            [point] => 60
        )
    [6] => Array
        (
            [name] => 坂本
            [point] => 85
        )
    [7] => Array
        (
            [name] => 木村
            [point] => 95
        )
    [8] => Array
        (
            [name] => 細川
            [point] => 85
        )
    [9] => Array
        (
            [name] => 橋本
            [point] => 70
        )
)

まずは配列をソート(並び替え)する

まずは無作為に追加された配列をpointの大きい順にソートする必要があります。
※PDOなどで配列を取得する場合はORDER BY DESCで取得できるためこの処理は不要です。

PHPのバージョンが5.5以上の場合はarray_column関数が使えるので、、array_multisortとarray_columnを使用して1行で降順ソートが可能です。

参考 PHPで配列をソートする方法一覧

array_multisort(array_column($aryRanking, 'point'), SORT_DESC, $aryRanking);

PHPのバージョンが5.5未満の場合は、foreachでソートしたいキーの値を事前に取得しておく必要があります。

参考 PHPのforeachを徹底解説【サンプルコード有】

//foreachでソートしたい値を取り出す
$arySort = [];
foreach($aryRanking as $key => $value){
  $arySort[$key] = $value['point'];
}

array_multisort($arySort, SORT_DESC, $aryRanking);

ソートした結果をprint_rで出力するとこのような並びになります。

Array
(
    [0] => Array
        (
            [name] => 田中
            [point] => 100
        )
    [1] => Array
        (
            [name] => 真島
            [point] => 100
        )
    [2] => Array
        (
            [name] => 木村
            [point] => 95
        )
    [3] => Array
        (
            [name] => 佐藤
            [point] => 90
        )
    [4] => Array
        (
            [name] => 山本
            [point] => 90
        )
    [5] => Array
        (
            [name] => 坂本
            [point] => 85
        )
    [6] => Array
        (
            [name] => 細川
            [point] => 85
        )
    [7] => Array
        (
            [name] => 角田
            [point] => 80
        )
    [8] => Array
        (
            [name] => 橋本
            [point] => 70
        )
    [9] => Array
        (
            [name] => 山田
            [point] => 60
        )
)

ランキングを出力する

ランキングの出力は、配列の中身をすべて繰り返せるforeachで行います。

参考 PHPのforeachを徹底解説【サンプルコード有】

同率順位処理なしの場合

同率順位処理なしなので、純粋な繰り返しの回数をカウントして表示しています。

$rank = 1;

$html = '';
$html .= '<table>';
$html .= '<tr><th>順位</th><th>名前</th><th>点数</th></tr>';
foreach($aryRanking as $key => $value){
    $html .= '<tr>';
    $html .= '<td>'.$rank.'</td>';
    $html .= '<td>'.$value['name'].'</td>';
    $html .= '<td>'.$value['point'].'</td>';
    $html .= '</tr>';
    $rank++;
}
$html .= '</table>';

//HTMLタグを表示
echo $html;
順位名前点数
1田中100
2真島100
3木村95
4佐藤90
5山本90
6坂本85
7細川85
8角田80
9橋本70
10山田60

同率順位処理ありの場合

同率順位(タイ)表示を行う場合は、1つ前のポイントと同じ場合は、順位を加算しない処理を追加します。

$rank = 1;
$cnt = 1;
$bef_point = 0;

$html = '';
$html .= '<table>';
$html .= '<tr><th>順位</th><th>名前</th><th>点数</th></tr>';
foreach($aryRanking as $key => $value){
    //前回と同順位の場合は、順位を加算しない
    if($bef_point != $value['point']){
        $rank = $cnt;
    }
    $html .= '<tr>';
    $html .= '<td>'.$rank.'</td>';
    $html .= '<td>'.$value['name'].'</td>';
    $html .= '<td>'.$value['point'].'</td>';
    $html .= '</tr>';
    $bef_point = $value['point'];
    $cnt++;
}
$html .= '</table>';

//HTMLタグを表示
echo $html;
順位名前点数
1田中100
1真島100
3木村95
4佐藤90
4山本90
6坂本85
6細川85
8角田80
9橋本70
10山田60

ランキングを作る際、同率順位はよくあることなので、是非参考にしてみてください。

以上、PHPでランキングの作り方、でした。

PHP