如何从多个数组中选择php重复排名

时间:2015-03-23 12:19:43

标签: php

我正在开发一个操纵大学生考试成绩的数据库。基本上,我正在从MySql数据库中提取记录,在任何给定时间都会激活一个类。我想对学生进行排名,表现最好的是1号。

我试着阅读这篇文章,但它只显示单个数组:

http://stackoverflow.com/questions/6163225/how-do-i-rank-array-values-with-duplicate-values-and-skipping-some-positions-if

这是一个例子;

获取结果和make和数组

$grades = array();
    foreach($results->result() as $row){

        $grades[] = array('rank'=>$row->total,'name'=>$student_name);

    }

数组结果:

$grades[] = array(
array('rank'=>"123","name"=>"samphors"),
array('rank'=>"123","name"=>"sovann"),
array('rank'=>"102","name"=>"dy vann"),
array('rank'=>"113","name"=>"koro vann")
);

所以我想将Mysql数据捕获为多个数组。一旦我有一个数组中的数据,我应该为每个学生分配一个位置,如1/10(数字1,123得分),4/10等。现在的问题是,如果有一个平局,然后下一个分数跳过一个位置,如果在一个位置有3个分数,则下一个分数跳过2个位置。所以上面的分数排名如下;

----------------------------------
| no | name       | score | rank |
| 1  |samphors    | 123   | 1    |
| 2  |sovann      | 123   | 1    |
| 3  |koro vann   | 113   | 2    |
| 4  |dy vann     | 102   | 3    |
----------------------------------

是否有可能(人类可能/ php可能)使用PHP对上述学生​​的分数和名称进行排名,以便能够处理可能的关系,例如在一个位置获得4分?很可能,我无法想出这样做的功能。我需要一个PHP函数(或者某些东西...... PHP)来获取数组并产生如上所述的排名。

任何帮助都将深表感谢,不过我认为我可能会要求太多。如果可以使用MySQL查询数据执行此操作而不将其放入数组中,那么这也会有所帮助!

3 个答案:

答案 0 :(得分:0)

您应该将您的mysql查询更改为

SELECT * FROM `your table name` ORDER BY `rank` ASC

答案 1 :(得分:0)

这将处理具有相同分数的排名。基本上你必须在查询中做到这一点。

SELECT  d.*, c.ranks
FROM
    (
      SELECT    Score, @rank:=@rank+1 Ranks
      FROM
              (
                  SELECT  DISTINCT Score 
                  FROM    tableName a
                  ORDER   BY score DESC
              ) t, (SELECT @rank:= 0) r
    ) c 
    INNER JOIN tableName d
        ON c.score = d.score

答案 2 :(得分:0)

我的PHP解决方案。 这要求您的结果按score ASC排序。

<?php

// Start array
$grades = array(
  array('score' => "123", "name" => "samphors"),
  array('score' => "123", "name" => "sovann"),
  array('score' => "113", "name" => "koro vann"),
  array('score' => "102", "name" => "dy vann")
);

$i         = 0;
$prevScore = 0;

foreach ( $grades as &$grade ) {
  // Increment rank only if scores different
  if( $grade[ 'score' ] != $prevScore ){
    $i++;
  }

  $prevScore = $grade[ 'score' ];
  $grade[ 'rank' ] = $i;
}

echo '<pre>';
print_r($grades);
echo '</pre>';

?>

输出:

Array
(
  [0] => Array
      (
          [score] => 123
          [name] => samphors
          [rank] => 1
      )

  [1] => Array
      (
          [score] => 123
          [name] => sovann
          [rank] => 1
      )

  [2] => Array
      (
          [score] => 113
          [name] => koro vann
          [rank] => 2
      )

  [3] => Array
      (
          [score] => 102
          [name] => dy vann
          [rank] => 3
      )

)