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でランキングの作り方、でした。

ディスカッション
コメント一覧
まだ、コメントがありません