php

时间:2016-01-21 20:55:24

标签: php ranking

我一直在与一个复杂的排名系统进行斗争。排名取决于与学生无关的学生积分。积分计算对我来说没问题。打破关系时会出现问题,因为这取决于完全不同的学生标记。学生可以有类似的积分但标记不同,可以用来打破平局,以防一些学生与积分相关。我需要帮助,因为我卡住了。请参考我的图片以获得一个粗略的想法并告诉我它是否可以完成。我还提供了一些代码。

A visual illustration

<?php
$rank_by_point=array();
//loop out students and get their admission number from which you calculate individual points based on an algorithm
foreach($students as $student => $student_no){
 array_push($rank_by_point[$student_no],calculatePoints($student_no));
}
//sorting the points from highest to lowest
arsort($rank_by_point);

//the ranking code down here
$ties=array();
$break=array();
$initial_positions=array();
$rank = 0;
$last = false;
foreach($rank_by_point as $key => $value){
  if($last != $value){
     $last = $value;
     $rank++;                 
  }else{
    //when a tie is detected add the values to a tie array
    array_push($ties[$key],$rank);
  }
  array_push($initial_positions[$key],$rank);
}
//spliting of ties is done by getting marks and rearrangin the tie
foreach($ties as $admno => $st_rank){
  $read_position=$rank;//same value for all keys in the ties array
  $getmarks=getMarks($admno);
  array_push($break[$admno],$getmarks);
  //reorder the array in desc order
  arsort($break);
}
//reranking the ties. i got stuck here :-(
?>

2 个答案:

答案 0 :(得分:2)

编写一个比较标记的比较函数,并通过比较点来打破关系。然后使用usort使用此函数对$students数组进行排序。

function compare_students($s1, $s2) {
    $p1 = calculatePoints($s1);
    $p2 = calculatePoints($s2);
    if ($p1 == $p2) {
        return getMarks($s1) - getMarks($s2);
    } else {
        return $p1 - $p2;
    }
}

usort($students, 'compare_students');

答案 1 :(得分:2)

  1. 将学生分数作为较小分数添加到calculatePoints($student_no)。例如

     function calculatePoints($student_no){
    
         /*add this before return it*/
    
         $point = $point*1000;//make sure the new $point be bigger than the max $student_mark
    
         $point += $student_mark;
    
         return $point;
     }
    
  2. 按现在排序