php实现排名和超过多少用户比率

项目场景:

我们项目中有给用户打分。分值分别为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%

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员若风+

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值