项目场景:
我们项目中有给用户打分。分值分别为100 100 100 90 90 80 80 70 60 60
如果是第一名 那么我们预期的结果是超越100%的用户。如果分数是90 那么应该是超越50%的用户。
核心代码
public function test($data, $score){
$all_score = array_values($data); //所有分数
$total_card = count($all_score); //所有餐卡数量
$all_score_no_repeat = array_unique($all_score); //去重后的所有分数
$all_score_no_repeat = array_values($all_score_no_repeat); //键值重新排序
rsort($all_score_no_repeat); //去重后的所有分数排名降序
$all_score_and_count = [];
foreach ($all_score as $value) {
//统计所有排名拥有的人数
$rank = (array_search($value, $all_score_no_repeat)) + 1;
$all_score_and_count[$rank]++; //所有排名位置的数量
}
if(!in_array($score, $all_score)){
return null;
}
//当前分数所处于的排名
$now_rank = array_search($score, $all_score_no_repeat) + 1;
if ($now_rank == 1) {
//如果是第一名 超越100%的人
$rate = 1;
} else {
//计算超越的人数
$transcend_count = 0;
foreach ($all_score_and_count as $key => $value){
if($key > $now_rank){
$transcend_count += $value;
}
}
//根据超过的人数来计算超过的百分比
$rate = round($transcend_count / $total_card, 1);
}
$rate_percent = $rate * 100 . "%";
return $rate_percent;
}
数据测试
test([100, 100, 100 ,90, 90, 80, 80, 70, 60 ,60,], 90) 结果:50%
test([100, 100, 100 ,90, 90, 80, 80, 70, 60 ,60,], 80) 结果:30%
test([100, 100, 100 ,90, 90, 80, 80, 70, 60 ,60,], 80) 结果:100%