• 締切済み

順位をつけたいです。

質問があります。 ゴルフの結果の順位を表示したいと考えています。 ---------------------------- $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

  • PHP
  • 回答数5
  • ありがとう数6

みんなの回答

noname#18290
noname#18290
回答No.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; }

回答No.4

こんにちは。 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>"); } ?>

  • sou_sk
  • ベストアンサー率71% (15/21)
回答No.3

> マイナスが大きい人が順位が高い は問題無いのでは。関数が用意されていると思いますし、逆順にすればいいだけの話で。 重複名があるというのは仕様上問題があるのでは。プレーヤーIDを与えるなど名前とは別に一意な識別名を用意するべきです。 で、ソートですが私は勉強不足でアルゴリズム等は存じておらずこの手の方法しか考えつかないのですが、 1. スコアが同じユーザー同士を括ってグループとして分類する 2. グループ内のソートを行う 3. グループのソートを行う 4. グループの人数を評価して順位付けを行う 規模が示されていないので何とも言えませんが SQL やコーディングから工夫すればそれなりに使える速さで組めると思います。

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.2

結構複雑ですね。 1.名前のソート 2.点数のソート 3.順位付け 4.印刷 ソートは単純なバブルソート(隣接交換法)がいいでしょう。 EXCELなら似たことは簡単にできるのですが。

  • toopeaan
  • ベストアンサー率0% (0/1)
回答No.1

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

pantsu69
質問者

補足

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

関連するQ&A

  • 順位付け関数について

    ゴルフコンペで使用するゴルフの順位付けに困っております。     (1)(スコア) (2)(ハンデ) (3)((1)-(2))  (4)(順位)  Aさん   90       5       85        1 Bさん   91       6       85        1 Cさん   92       7       85        1 3人共に(3)は同スコアで、(4)の順位欄は全員1位ですが、これを順位欄が ハンデの少ない人が1位、次にハンデが少ない人が2位となるような関数 は御座いませんでしょうか。 一通り調べたのですが未だにわからず、大変お恥ずかしいですが 何卒御教示の程、宜しく御願い申し上げます。

  • エクセルで成績に順位をつける方法

    グラウンドゴルフの成績順位を決める場合、次のルールがあります。 1)スコアの少ない(小さい数字)のが上位 2)スコアが同数の場合、「1打」(ホルインワン)が多い人が上位 3)スコアが同数で、「1打」も同数の場合、「2打」の多い人が上位 4)スコア、「1打」、「2打」も同数の場合は、同一ランクとする 下記はの「順位」はRANK係数でつけた場合ですが、これを→にする方法をご教示下さい。 氏名  スコア  1打数  2打数  順位  →修正 A     66     4     12     1     1 B     66     3     14     1     2 C     71     3     14     3     3 D     72     3     15     4     4 E     72     2     10     4     5 F     74     3      9     6     7 G     74     3     11     6     6

  • ゴルフの順位付け

    先日、ゴルフコンペで同スコアの人がいました。 2人とも43-45の88で、ハンデも同じでしたが、 年齢の若い方の人が上位になっていました。 同スコア、同ハンデの場合、年寄りが上位と思ていましたが、 各ホール毎のスコア(バーディ数等)が考慮されたのでしょうか? もしくは、年齢の登録が間違っていたのでしょうか? ゴルフ場のシステム毎に順位付けの方法は違うのでしょうか?

  • RANK関数 順位が同じだった場合の条件が2つあります

    RANK関数で求めた結果が同じだった場合、別のフィールドを見に行って順位を同じにしない方法はわかりました。 RANK関数とSUMPRODUCT組み合わせすればいいんですね。 今回は条件が2つあります。 ゴルフの順位を求めたい。 まず結果にて順位を求めました。同じ順位だった場合「IN」の数字を見に行きます。そこでも同じだった場合(「OUT」が違えばありえますよね?) 次に見に行くのが年齢を見に行くそうです。 RANKにSUMPRODCTを2つ組み合わせてみたのですがうまくいきませんでした。 よろしくお願いします

  • GoogleSpreadsheetsの順位の作り方

    いつもお世話になります。めぐみと申します。 グーグルスプレッドシートで同シート内で 下記、「■データ」以下の数値をもとに、「■順位結果」を出力する関数ができるものでしょうか。 順位表を作成したと考えています。 自分で何度か試してみたのですが非常に難しく、質問させていただいた次第です。 もし、お分かりになる方がいましたらご指導いただきたく何卒よろしくお願いいたします。 ■データ Sheet1のA列~T列 名前,,,,,,,,,,,,,,,,,,,合計 福士ひとみ,6,4,7,5,6,5,9,5,5,5,6,6,5,5,5,6,4,5,99 堀玉枝,5,4,5,4,5,5,5,7,5,4,5,6,4,7,3,4,4,4,86 間端光子,5,4,6,5,6,4,4,11,7,6,4,6,3,5,4,7,4,6,97 水間史子,4,4,6,6,5,5,5,7,6,5,5,6,4,6,5,6,3,5,93 宮下公子,6,4,8,5,7,4,9,5,4,6,3,10,3,9,5,6,4,6,104 横山悦子,6,4,7,8,6,4,6,6,4,7,5,4,5,4,5,7,5,4,97 ■順位結果 Sheet1のV列~AP列

  • エクセルRANK関数の同率順位を別表に抽出する時

    お世話になります。 エクセル2003を利用しています。初心者なので教えていただきたく存じます。 以下文面のようにランキング表を作りました。 RANK関数を利用してランキングを出し、順位表にTOP5(重複していても)まで出したいと思っています。 A列にA店~Z店までの名前(A店という名前は仮です)が入っており、 B列に上から結果数字がランダムに入力がされており、 C列にRANK関数を使って順位がその結果の横に数字として反映されています。 B列の順位の数字が大体1~20程度までの数字が記入されており、C列のRANK関数の結果が当然ですが重複して順位が表示されている状態です。 別表を作成して1~5位のランキング表を作り、A列に入っている店名とを表示させたいと思っております。 1位と2位は単独であったので店名はINDEXとMATCH関数を使ってきれいに抽出できたのですが、 3位以下は重複しているようで#N/Aと表示されてしまいます。 表示の仕方として「あいうえお順(A~Zの若い順)」で表示できればと思っております。 無知で恐縮なのですが、情報不足の点等あればご指摘いただきたく存じます。 お詳しい方、ご教授宜しくお願い致します。

  • ランダムに振り分けを(並び換え)する場合

    町内でグランドゴルフをします。 今、Excelで名簿を作っており、例えばA地区の30人分を打ち、次はB地区の30人分、C地区・・・・・といったように地区ごとかたまっています。名前を50音順でソートをかけたら、ある程度はバラバラに並び変わりますが、同じ地区に同姓の人がいたら、重複します。 私がやりたいのは各地区から一人ずつで選んだチーム分けをしたいです。なおかつ次に振り分けるときも、新たな振り分けにしたいです。 また、ボタンをシートに貼り、そのボタンをクリックする度に、並びが換わるようにしたいので、その方法も教えて下さい。

  • エクセル・順位関係のデータ抽出

    エクセルの関数に関する質問です。 名前 1点数 1順位 2点数 2順位 ○○  ○   ○   ○   ○  ○○  ○   ○   ○   ○  ○○  ○   ○   ○   ○  となっている表がsheet1にあったとき、1順位と2順位のいずれかが20位以内に入る人のデータだけを集めた表を、sheet2に抽出したいです。関数などを用いて、sheet1の表にデータを入れ込めば一発で結果がsheet2に表示されるようなフォーマットを作りたいのですが、方法を教えてください。

  • 「差し込み印刷」で使う「アドレス帳」の名前順位を変えられますか?

    「Word」差し込み印刷で作成した「アドレス帳」についての質問です。 「アドレス帳」の名前の順位は変えたくない。だがしかし、入力洩れがあったり、名前の追加があったりして、アドレス帳の修正が必要になります。  そこで次の3点ができるのか、教えてください。  1) 例えば、名簿の5行目の人を6行目に、6行目の人を5行目に、のように順位の入れ替える。   2)3行目でも、10行目でもいいのですが、任意の行に、追加入力が出来ますか。    3)任意の行でデータ削除をするには、どうするのか。 削除した行は次行が繰り上がって埋まってくれますか。   名前の順位にこだわるのは、町内会の名簿を作る時を想像してください。家の並び順、即ち、その家の住人-名前で作りますよね。従って、昇順・降順などは使えないと思っています。

  • ソートとフォームデータの格納について

    perlを勉強して恥を承知で困っています。 先日、こちらで質問し大いに助けてもらったのですが 不甲斐ないながらどうすれば良いのか分からず、アドバイスを求めています。 ・使用言語:perl ・目的:htmlから「名前」「スコア」を入力し、 スコアが降順(高い順)に名前とスコアを表示する ランキングcgiの作成 ・現状の進行度 score.html #名前とスコアを入力するhtml ranking.cgi #ソートし、入力されたスコアをランキングに組み込む cgi-lib.plをDL ・分からない事 ソートする時、スコアを降順にするにしても、 名前をどうやってスコアと一緒に連れてソートするのか、 cgi-lib.plは(ranking.)cgiに設置すればいいのでしょうか? どうかご教授賜りたく候。 score.html --------------------- <html> <head> <title>テスト</title> </head> <body> <form action="request/ranking.cgi " METHOD="post"> 名前 : <input type="text" name="NewName"><br> スコア: <input type="text" name="NewScore"><BR> <input type="submit" value="送信"> </form> </body> </html> ranking.cgi --------------------- #!/url/local/bin/perl #データの格納 my %input; &ReadParse(\input); $nn = $input{'NewName'}; $ns = $input{'NewScore'}; #ソート my @v = {100,200,300}; my @k = sort{$b <=> $a;} @v; #受け取ったスコアとランキングとの比較 if($ns > @k[1]){ @k[3] = @k[2]; @k[2] = @k[1]; @k[1] = $ns; }elsif($ns =< @k[1] && $ns > @k[2]){ @k[3] = @k[2]; @k[2] = $ns; }else($ns =< @k[2] && $ns > @k[3]){ @k[3] = $ns; } #出力 print "結果\n" for(my $i=0;$i<@k;$i++){ print "$i位: $k[$i]<BR>\n"; }