0
点赞
收藏
分享

微信扫一扫

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%


举报

相关推荐

0 条评论