【问题标题】:Ranking with PHP on certain condition在特定条件下与 PHP 排名
【发布时间】:2017-07-08 12:55:20
【问题描述】:

我有几个学生在php数组中打分的分数。

$firstarray:

Array ( 
       [0] => Array ( 
             [6] => Array ( //I want to skip this student from ranking
                     [ENGLISH] => 45.00 
                     [MATHEMATICS] => 5.00 
                     [SCIENCE] => 40.00 
                    ) 
                ) 
      [1] => Array ( 
             [7] => Array ( 
                     [ENGLISH] => 41.00 
                     [MATHEMATICS] => 40.00 
                     [SCIENCE] => 47.00 
                     ) 
                ) 
      ) 
      [2] => Array ( 
             [8] => Array ( 
                     [ENGLISH] => 42.00 
                     [MATHEMATICS] => 44.00 
                     [SCIENCE] => 40.00 
                     ) 
                )
      [3] => Array ( 
             [9] => Array ( 
                     [ENGLISH] => 42.00 
                     [MATHEMATICS] => 25.00 
                     [SCIENCE] => 31.00 
                     ) 
                ) 
      )

在另一个数组中,我有每个学生的总分与排名。:

$secondarray:

Array ( [7] => 
           Array ( 
             [score] => 128 
             [rank] => 1 
            ) 
        [8] => 
           Array ( 
             [score] => 126
             [rank] => 2 
            ) 
        [9] => 
           Array ( 
             [score] => 98
             [rank] => 3 
            ) 
       [6] => 
           Array ( 
             [score] => 90 
             [rank] => 4 
            ) 
        ) 

在取出学生所有科目的总分后,我使用以下php代码计算并列排名:

$totalmarkscore:

   Array ( 
       [0] => Array ( 
            [6] => 90 
           ) 
       [1] => Array ( 
            [7] => 128 
           ) 
       [2] => Array ( 
            [8] => 126 
           )
       [3] => Array ( 
            [9] => 98
           ) 
       ) 

   $rankchu =array();
   foreach($totalmarkscore as $k => $vl){
      if(is_array($vl)){
          foreach($vl as $hlutna =>$ken){
             $rankchu[$hlutna]= $ken;
      }
    }
  }
  $secondarray = setRankings($rankchu);    

我的问题是:我如何跳过计算每个科目未获得至少 15 分的学生的排名?但我还是想显示学生分数的评分细节,我只是想从排名中跳过它,然后保持排名顺序。在上面的例子中,我想跳过 id=6 的学生,因为他在排名计算中没有得到最低 15 分(他只得 5 分),其他保持不变。 请帮忙。谢谢。

【问题讨论】:

  • 你怎么知道他只有5分?请显示代码,确定这一点。
  • 还要记住,如果两个学生是同等的,他们的排名相同,你需要跳过下一个。
  • @CasimiretHippolyte,我做到了,我有一个排名函数setRankings($var) 可以确定这一点。请查看我对 $secondarray 的预期输出。
  • 您从哪里获得信息?如果是来自数据库,在查询数据库时考虑计算和过滤
  • 在这种情况下,我建议您以可以直接使用的格式从数据库中获取数据。

标签: php arrays sorting ranking


【解决方案1】:

当您处理$firstarray 时,您需要保留任何分数是否低于15 分的信息。这里我们添加一个can_be_scored 标志来存储它:

 $totalmarkscore = array_reduce(
   $firstarray,
   function($result, $item) {
     $id = key($item);
     $scores = $item[$id];
     $result[$id] = array(
       "score" => array_sum($scores),
       "can_be_scored" => min($scores) >= 15
     );
     return $result;
   },
   array()
 );

有了这个,$totalmarkscore 应该看起来像这样:

Array (
    [7] => 
       Array ( 
         [score] => 128 
         [can_be_scored] => true
        ) 
    [8] => 
       Array ( 
         [score] => 126
         [can_be_scored] => true
        ) 
    [9] => 
       Array ( 
         [score] => 98
         [can_be_scored] => true
        ) 
   [6] => 
       Array ( 
         [score] => 90 
         [can_be_scored] => false
        ) 
    ) 

然后,在setRankings中,你可以检查$item["can_be_scored"]是否为假,如果为假,则排除该项目。

【讨论】:

  • Solymosi,请看一下我预期的 $second 数组的输出。
  • 目前还不清楚您到底要什么。您想将分数低于 15 的用户的分数包括在内,但将其排除在排名计算之外?还是您想从最终数组中完全排除这些用户?
猜你喜欢
  • 2018-05-27
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
  • 2020-10-25
  • 2021-06-06
相关资源
最近更新 更多