5.x _CourseList.php _CourseList::sort_best_grade_first(Student $student = NULL)
4.x _CourseList.php _CourseList::sort_best_grade_first()

Sorts best-grade-first, as defined by the setting "grade_order", which is a CSV of grades, best-first. Ex: A, B, C, D, F

If the student object is set to a student, we will use that's student's best grade for a course, rather than the actual course's grade. Generally, this can be left as set to null. This is only for when we are trying to organize a list of courses into the grade order, based on what a student has taken. For example, if we want to order a Group's list of courses based on what the student has taken and the grades they made.


classes/_CourseList.php, line 598




function sort_best_grade_first(Student $student = NULL) {

  $temp = csv_to_array(variable_get("grade_order", "AMID,BMID,CMID,DMID,FMID,A,B,C,D,F,W,I"));
  // We will use array_flip to get back an assoc array where the grades are the keys and the indexes are the values.
  $temp = array_flip($temp);
  // Go through the grades and convert the integers to strings, padd with zeros so that everything is at least 3 digits.
  $grades = array();
  foreach ($temp as $grade => $val) {
    $grades[$grade] = str_pad((string) $val, 3, "0", STR_PAD_LEFT);

  // We now have our grades array just how we want it.  Best grade has lowest value.  Worst grade has highest value.

  $unknown_grade_value = 999; // sort to the very end, in other words.   
  $student_grade_score = 0;

  // We are going to go through our courses and, based on the grade, assign them a value.
  $tarray = array();
  for ($t = 0; $t < $this->count; $t++) {
    // $t is the index for the array_list, keep in mind.

    $c = $this->array_list[$t];

    $use_grade = $c->grade;

    if ($student != null) {
      $use_grade = $student->get_best_grade_for_course($c);
      if (!$use_grade) {
        $use_grade = "";

    @$grade_value = $grades[$use_grade];
    if ($grade_value == "") {
      // Couldn't find this grade in our array, so give it the unknown value.
      $grade_value = $unknown_grade_value;

    $student_grade_score += intval($grade_value);
    // Add to a string in array so we can sort easily using a normal sort operation.
    $tarray[$grade_value][] = $c;


  // Sort best-grade-first:
  ksort($tarray, SORT_NUMERIC);

  // Okay, now go back through tarray and re-construct a new CourseList
  $new_list = new CourseList();
  foreach ($tarray as $per_grade_courses) {
    foreach ($per_grade_courses as $course) {

  // Okay, now $new_list should contain the correct values.
  // We will transfer over the reference.
  $this->array_list = $new_list->array_list;

  // And we are done!
  if ($student != NULL) {
    // Return the "student grade score" for this list of courses.
    return $student_grade_score;