我想使用 PHP 计算并存储数组中所有条目的密集排名和间隙排名。
我想在 PHP 中执行此操作(而不是 MySQL,因为我每周处理 100,000 到 900 个组合的动态组合,这就是为什么我不能使用 MySQL 制作那么多表。
我查找密集排名的代码有效,但间隙排名不正确。
PHP code
$members = [
['num' => 2, 'rank' => 0, 'dense_rank' => 0],
['num' => 2, 'rank' => 0, 'dense_rank' => 0],
['num' => 3, 'rank' => 0, 'dense_rank' => 0],
['num' => 3, 'rank' => 0, 'dense_rank' => 0],
['num' => 3, 'rank' => 0, 'dense_rank' => 0],
['num' => 3, 'rank' => 0, 'dense_rank' => 0],
['num' => 3, 'rank' => 0, 'dense_rank' => 0],
['num' => 5, 'rank' => 0, 'dense_rank' => 0],
['num' => 9, 'rank' => 0, 'dense_rank' => 0],
['num' => 9, 'rank' => 0, 'dense_rank' => 0],
['num' => 9, 'rank' => 0, 'dense_rank' => 0]
];
$rank=0;
$previous_rank=0;
$dense_rank=0;
$previous_dense_rank=0;
foreach($members as &$var){
//star of rank
if($var['num']==$previous_rank){
$var['rank']=$rank;
}else{
$var['rank']=++$rank;
$previous_rank=$var['num'];
}//end of rank
//star of rank_dense
if($var['num']===$previous_dense_rank){
$var['dense_rank']=$dense_rank;
++$dense_rank;
}else{
$var['dense_rank']=++$dense_rank;
$previous_dense_rank=$var['num'];
}
//end of rank_dense
echo $var['num'].' - '.$var['rank'].' - '.$var['dense_rank'].'<br>';
}
?>
我的有缺陷的输出是:
num |
rank |
dynamic rank |
2 |
1 |
1 |
2 |
1 |
1 |
3 |
2 |
3 |
3 |
2 |
3 |
3 |
2 |
4 |
3 |
2 |
5 |
3 |
2 |
6 |
5 |
3 |
8 |
9 |
4 |
9 |
9 |
4 |
9 |
9 |
4 |
10 |
请注意,当错误发生并且数字列中有更大的数字时,它会更正该行中的错误。当数字从 3 变为 5 时看到。