我为每个玩家分配了这样的分数:
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
答案 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
我希望这会有所帮助。