多次元配列の複数人のスコアから順位を配列にて返す方法
行いたいことは、例えば、5人のスコアが1人目から順に
{80,50,88,100,55}と異なるスコアから順位を返却したい。
戻り値としては、順位なので、{3,5,2,1,4}と返す。
初心者がプログラミングを行い場合、どうやって返却値を返せばいいか
思いつくことは、総当たりの比較やmax,min関数を使用してからの順位算出。
いずれもコードを書いてしまうのであまり好ましい方法ではありません。
そうすると他のやり方は、ソートで返すやり方となります。
以下のやり方で説明します。あくまで5人のスコアが全て異なる場合です。
同スコアが複数いる場合、仕様によっては、同じ順位で返す、
もしくは、書いてある方優先で順位付けするといったことになると思います。
function s_juni($n0,$n1,$n2,$n3,$n4) {
$wk = array(
array(
'id' => 0,
'score' => $n0,
'juni' => ''
),
array(
'id' => 1,
'score' => $n1,
'juni' => ''
),
array(
'id' => 2,
'score' => $n2,
'juni' => ''
),
array(
'id' => 3,
'score' => $n3,
'juni' => ''
),
array(
'id' => 4,
'score' => $n4,
'juni' => ''
));
foreach ((array) $wk as $key => $value) {
$sort[$key] = $value['score'];
}
array_multisort($sort, SORT_DESC, $wk); // ①
for($i=1; $i<6; $i++) { // ②
$wk[$i-1]['juni'] = $i;
}
foreach ((array) $wk as $key => $value) {
$sort[$key] = $value['id'];
}
array_multisort($sort, SORT_ASC, $wk); // ③
$wk2 = array();
array_push($wk2,$wk[0]['juni'],$wk[1]['juni'],$wk[2]['juni'],$wk[3]['juni'],$wk[4]['juni']);
return $wk2;
}
まず、array()で、id=>プレイヤー、score=>スコア、juni=>順位(初期値は、空)
にします。
もともとの初期が、id昇順です。これを、scoreを降順としてソートを行います。(①の部分)
ソートを行った後、5名分の順位を割り振っていきます。(②の部分)
その後、ソートをid昇順に戻し(③の部分)、順位を配列に詰めて返却します。
そうすると、{3,5,2,1,4}の値が返却されるので呼び出し側では、
$wk = {3,5,2,1,4}
のようになるので、
$wk[0] = 3、$wk[1] = 5、$wk[2] = 2、$wk[3] = 1、$wk[4] = 4
となります。
もし、人数を追加したい場合は、引数を増やす、配列を増やす、forでLoopしている$i<6の部分を加算するなどする。for文中で順位を入れているので同順位対応といった場合は、
裏変数として人数をカウントする変数と順位比較で前のスコアを保持しておく必要がある。