所以我有下一个数组($ termgpxx):
Array (
[6] => 1.75
[1] => 1.5
[5] => 0.875
[8] => 0
[2] => 1.5
[4] => 1.5
[3] => 1.1666666666667
)
每个键代表一个人的ID。
我所管理的:
arsort($termgpxx);
foreach ($people as $human){
echo 'Current rank for human X is'. (array_search($human,array_keys($termgpxx))+1)
}
上面将给我一个排名数字,从1(数组中的最高值)到有多少人,但我将不接受以下内容:
对于键1,键2和键4,我有3个重复值,因此我需要所有三个键的等级相同,因此输出为:
Current rank for human X is 1 (1.75)
Current rank for human X is 2
Current rank for human X is 2
Current rank for human X is 2
Currenk rank for human X is 3
...etc
我将感谢任何正确的想法。谢谢!
答案 0 :(得分:1)
您可以做的是先通过获取唯一值然后对它们进行排序来对得分进行排名。然后将数组中的值更改为实际排名,因此使用...
$rankScore = array_unique($termgpxx);
rsort($rankScore);
foreach ( $termgpxx as &$term ) {
$term = array_search($term, $rankScore )+1;
}
print_r($termgpxx);
提供您的输出
Array
(
[6] => 1
[1] => 2
[5] => 4
[8] => 5
[2] => 2
[4] => 2
[3] => 3
)
答案 1 :(得分:0)
另一种跟踪当前弯度并手动增加位置的方法:
$position = 0;
$prevRank = 0;
foreach ($a as $id => $value) {
if ($position === 0) {
$position = 1;
$prevRank = $value;
} elseif ($value < $prevRank) {
$prevRank = $value;
$position++;
}
echo 'Current rank for human ' . $id . ' is ' . $position . '(' . $value . ')' . PHP_EOL;
}
提琴here。
答案 2 :(得分:0)
对数组进行排序后,您可以遍历它,并根据分数/级别的变化增加排名。
我添加了两种不同的数组结构,一种是玩家排名地图,另一种是玩家排名地图。
<?php
$scores =
[
6 => 1.75,
1 => 1.5,
5 => 0.875,
8 => 0,
2 => 1.5,
4 => 1.5,
3 => 1.1666666666667
];
arsort($scores);
$last = null;
$rank = 0;
$rank_players = [];
$player_rank = [];
foreach($scores as $player => $score) {
if($last !== $score)
$rank++;
$rank_players[$rank][] = $player;
$player_rank[$player] = $rank;
$last = $score;
}
var_dump($rank_players, $player_rank);
输出:
array(5) {
[1]=>
array(1) {
[0]=>
int(6)
}
[2]=>
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(4)
}
[3]=>
array(1) {
[0]=>
int(3)
}
[4]=>
array(1) {
[0]=>
int(5)
}
[5]=>
array(1) {
[0]=>
int(8)
}
}
array(7) {
[6]=>
int(1)
[1]=>
int(2)
[2]=>
int(2)
[4]=>
int(2)
[3]=>
int(3)
[5]=>
int(4)
[8]=>
int(5)
}