在php中计算玩家位置的最佳方法

时间:2011-08-26 20:16:40

标签: php

我为每个玩家分配了这样的分数:

player1 = 20,player2 = 30,player3 = 50,player4 = 10,player5 = 25等等。

这些点随着得分的增加而变化。我想要做的是,如果玩家2看到他的页面,他应该看到哪个玩家的得分最高,他在所有玩家中的位置以及得分最低的玩家?什么是在PHP中执行此操作的最佳方法?所以它会显示如下:

Highest Scorer                 Player2                              Lowest Score
    player3       you are 2nd highest out of 5 players               player4

3 个答案:

答案 0 :(得分:3)

// $users is an array in the form: playerID => score
$minScore = 0; $minScoreUser;
$maxScore = -1; $maxScoreUser;
$thisScore; $thisPlayer;
foreach ($users as $player => $score)
{
   if ( $player == $queryPlayer )
   {
       $thisScore = $score;
       $thisPlayer = $player;
   }
   if ( $maxScore < 0 || $score > $maxScore )
   {
       $maxScore = $score;
       $maxScorePlayer = $player;
   }
   if ( $score < $minScore )
   {
       $minScore = $score;
       $minScorePlayer = $player;
   }
}

$higherCount = 0;
foreach ($users as $player => $score)
    if ( $score > $thisScore ) $higherCount++;

$ minScore和$ minScorePlayer是最低的玩家

$ maxScore和$ maxScorePlayer是最高的玩家

$ thisScore和$ thisPlayer是您感兴趣的玩家

$ higherCount是得分高于玩家的玩家数量

以上具有O(n)

的复杂性

排序解决方案的复杂度为O(n * logn)

答案 1 :(得分:1)

使用php uasort功能,然后你可以拥有你的玩家所在的位置。取自php.net:

function cmp($a, $b) {
if ($a == $b) {
    return 0;
}
    return ($a < $b) ? -1 : 1;
}

// Array to be sorted
$array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4);

// Sort and print the resulting array
uasort($array, 'cmp');

数组将如下所示:

Array
(
    [d] => -9
    [h] => -4
    [c] => -1
    [e] => 2
    [g] => 3
    [a] => 4
    [f] => 5
    [b] => 8
)

然后你可以使用它所代表的地方:

function key_offset(&$array, $searchKey){
    if(is_array($array) && array_key_exists($searchKey, $array)){
        $counter = 0;
        foreach($array as $key => $value){
            if($searchKey == $key){
                return $counter;
            } else {
                $counter++;
            }
        }
    }
} 

所以现在它看起来像这样:

// Array to be sorted
$array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4);

// Sort and print the resulting array
uasort($array, 'cmp');

// Return index of the place in which your player is now.
$index = key_offset($array, "PlayerName");

答案 2 :(得分:0)

我不确定现有的答案是否足够。

如果您只是想立刻找到每个人的得分和排名,那就很容易:只做

SELECT * FROM TableOfScores ORDER BY score

这将按顺序为您提供分数,并且您可以在每次迭代获得排名时递增计数器。但是,我认为你想要的只是简单地显示一个人的屏幕,从你的“你是第二高”的消息判断。在这种情况下,它甚至更简单,因为你当然不需要对整个列表进行排序只是为了获得一个人的排名。

请注意,您应该在分数上建立索引。当您插入/删除玩家分数时,这将占用一些时间,但它会使此查询运行得更快。

要查找完成的总测试次数

SELECT COUNT(*) AS TotalScores FROM TableOfScores

要查找当前用户的位置,请执行

SELECT COUNT(*) AS CurrentPersonsRank FROM TableOfScores WHERE score <= $currentPersonScore

我希望这会有所帮助。