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
)
)
(
[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行で降順ソートが可能です。
array_multisort(array_column($aryRanking, 'point'), SORT_DESC, $aryRanking);
PHPのバージョンが5.5未満の場合は、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
)
)
(
[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で行います。
同率順位処理なしの場合
同率順位処理なしなので、純粋な繰り返しの回数をカウントして表示しています。
$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でランキングの作り方、でした。
ディスカッション
コメント一覧
まだ、コメントがありません