電子書籍の厳選無料作品が豊富!

質問があります。
ゴルフの結果の順位を表示したいと考えています。
----------------------------
$score['makoto'] = -6;
$score['yuko'] = -2;
$score['kenta'] = 0;
$score['hiroshi'] = 0;
$score['yuko'] = 3;
----------------------------
<出力結果>
第1位:-6
makotoさん
第2位:-2
yukoさん
第3位:0
hiroshiさん
kentaさん
第5位:3
yukoさん
-----------------------------------------
名前の重複はあります。
ゴルフの結果なのでマイナスが大きい人が
順位が高いくなります。
また同じスコアの人は名前をソートして、
次の順位は変わります(3位→5位)

どうか宜しくお願いいたします。m(_ _)m

A 回答 (5件)

配列ソート関数は元々あるので


順位の付け方の部分の参考例を書きます。

$score = array(
 'yuko1' => -2,
 'yuko2' => 3,
 'kenta' => 0,
 'makoto' => -6,
 'hiroshi' => 0
);

asort($score);
$num = 0;
$i = 1;
$prev = -100;
foreach($score as $name => $point) {
 if($point != $prev) {
  $prev = $point;
  $num = $i;
 }
 echo "第{$num}位 : {$point}\n";
 echo "{$name}さん\n";
 ++$i;
}
    • good
    • 0

こんにちは。


PHPは、やりはじめて日が浅いんで、
外してるかも知れんが、こんな感じ?
$Name と $Score はそれぞれ対応する名前と点数で。

<?php
$Name=array("yuko","kenta","makoto","hiroshi","yuko");
$Score=array(-2,0,-6,0,3);
array_multisort($Score,SORT_ASC,SORT_NUMERIC,$Name,SORT_ASC,SORT_STRING);

print("第1位:".$Score[0]."<br>".$Name[0]."さん<br>");
for($i=1;$i<count($Name);$i++){
if($Score[$i] != $Score[$i-1]){
print("第".($i+1)."位:".$Score[$i]."<br>");
}
print($Name[$i]."さん<br>");
}
?>
    • good
    • 0

> マイナスが大きい人が順位が高い



は問題無いのでは。関数が用意されていると思いますし、逆順にすればいいだけの話で。

重複名があるというのは仕様上問題があるのでは。プレーヤーIDを与えるなど名前とは別に一意な識別名を用意するべきです。

で、ソートですが私は勉強不足でアルゴリズム等は存じておらずこの手の方法しか考えつかないのですが、

1. スコアが同じユーザー同士を括ってグループとして分類する
2. グループ内のソートを行う
3. グループのソートを行う
4. グループの人数を評価して順位付けを行う

規模が示されていないので何とも言えませんが SQL やコーディングから工夫すればそれなりに使える速さで組めると思います。
    • good
    • 0

結構複雑ですね。


1.名前のソート
2.点数のソート
3.順位付け
4.印刷

ソートは単純なバブルソート(隣接交換法)がいいでしょう。
EXCELなら似たことは簡単にできるのですが。
    • good
    • 0

$score['yuko'] = -2;


$score['yuko'] = 3;
データが上書きされてしまいますよ。

この回答への補足

すみません。
---------------------
makoto:-6
yuko:-2
kenta:0
hiroshi:0
yuko:3
---------------------
データが保持できればどのような形でも
いいです。
すみません、宜しくお願いいたします。

補足日時:2003/05/30 11:53
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!