массивы — Идеальный рейтинг со связями, использующими только 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

Решение

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]