完美排名与单独使用PHP的关系

时间:2016-05-08 04:18:20

标签: php arrays ranking rank

在我试图找到一个完美的排名解决方案时,我一直坚持给出正确的排名。代码将解释我想要实现的目标:

我有以下数组:

$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 个答案:

答案 0 :(得分:4)

只需更改您的其他块,您不会减少$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;
相关问题