2016-05-08 13 views
1

ネクタイで完璧なランキングソリューションを見つけようとして、正しいランク付けをしていました。コードは、私が良く達成しようとしていますかを説明します:PHP単体でネクタイとの完璧なランク付け

私は次の配列があります。

function setRanking($standings) { 
    $rankings = array(); 
    arsort($standings); 
    $rank = 1; 
    $tie_rank = 0; 
    $prev_score = -1; 
    foreach ($standings as $name => $score) { 
     if ($score != $prev_score) { //this score is not a tie 
      $count = 0; 
      $prev_score = $score; 
      $rankings[$name] = array('score' => $score, 'rank' => $rank); 
     } else { //this score is a tie 
      $prev_score = $score; 
      if ($count++ == 0) { 
       $tie_rank = $rank - 1; 
      } 
      $rankings[$name] = array('score' => $score, 'rank' => $tie_rank); 
     } 
     $rank++; 
    } 
    return $rankings; 
} 
echo '<pre>'; 
print_r(setRanking($standings)); 

:タイでそれをランク付けするために

$standings = array(
    'player_1' => 30, 
    'player_2' => 26, 
    'player_3' => 28, 
    'player_9' => 28 
); 

を、私は以下の機能を持っています出力:

Array 
(
    [player_1] => Array 
     (
      [score] => 30 
      [rank] => 1 
     ) 

    [player_3] => Array 
     (
      [score] => 28 
      [rank] => 2 
     ) 

    [player_9] => Array 
     (
      [score] => 28 
      [rank] => 2 
     ) 

    [player_2] => Array 
     (
      [score] => 26 
      [rank] => 4 
     ) 

) 

予想される出力:

Array 
(
    [player_1] => Array 
     (
      [score] => 30 
      [rank] => 1 
     ) 

    [player_3] => Array 
     (
      [score] => 28 
      [rank] => 2 
     ) 

    [player_9] => Array 
     (
      [score] => 28 
      [rank] => 2 
     ) 

    [player_2] => Array 
     (
      [score] => 26 
      [rank] => 3 
     ) 

) 

問題は、それが私の仮定に基づいて1,2,2,3印刷する必要があり、一方、それは1,2,2,4として順位を印刷しています。だから1,2,2,3をどのように印刷することができますか?事はどこで間違っている可能性がありますか?どんな助けもありがとうございます。ありがとう。

+1

ただあなたのelseブロックを変更してください。 –

答えて

4

ちょうどあなたの$rankの値を減らすことはありませんので、あなたのelseブロックを変更してください。 を実行するだけで、主な値を変更しない変数に格納する変数が1つ少なくなります。

foreach ($standings as $name => $score) { 
    if ($score != $prev_score) { //this score is not a tie 
     $count = 0; 
     $prev_score = $score; 
     $rankings[$name] = array('score' => $score, 'rank' => $rank); 
    } else { //this score is a tie 
     $prev_score = $score; 
     $rank--; // Decrements here 
     if ($count++ == 0) { 
      $tie_rank = $rank; 
     } 
     $rankings[$name] = array('score' => $score, 'rank' => $tie_rank); 
    } 
    $rank++; 
} 
return $rankings; 
+0

ありがとう、それは完璧に動作します。 –

+0

そのOkey、これを役に立つ答えとして受け入れることを忘れてはいけません。 –

関連する問題