2016-05-08 3 views
1

В моей попытке найти идеальное решение для ранжирования со связями, я застрял в правильном рейтинге. Коды будут объяснять, что я пытаюсь достичь лучше:Совершенный рейтинг с галсами с использованием только PHP

У меня есть следующий массив:

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

Теперь для того, чтобы причислить его со связями, у меня есть следующие функции:

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)); 

Выход:

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,4, тогда как он должен печатать 1,2,2,3 согласно моему предположению. Итак, как он может печатать 1,2,2,3? Где может быть что-то пошло не так? Любая помощь приветствуется. Благодарю.

+1

просто измените свой блок. –

ответ

4

Просто измените блок else, вы не уменьшаете значение $rank, чтобы оно сохраняло то же значение, что и оно. Вы просто делаете , потому что его значение меньше 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, Не забудьте принять это как полезный ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^