使用uasort()对CSV条目进行排序

时间:2018-05-15 16:57:27

标签: php csv

我正在尝试按降序排列每个学生的GPA。我已被告知uasort(),但我不确定要创建哪些关联规则,因为我正在尝试根据一个条目对整行进行排序。
我的数据库是一个CSV文件(不理想,但这是一个要求)。

这是我的PHP代码:

//Printing out details about each student in a table.
echo "<table border ='1'>";
echo "<tr>";
echo   "<th> Student ID </th>";
echo   "<th> First Name </th>";
echo   "<th> Last Name </th>";
echo   "<th> Birthdate </th>";
echo   "<th> Completed Courses </th>";
echo   "<th> Failed Courses </th>";
echo   "<th> GPA </th>";
echo   "<th> Status </th>";
echo "</tr>";
$data = file("../databases/students.csv");
foreach ($data as $line){
  $lineArray = explode(',', $line);
  list($studentID, $fName, $lName, $dob, $completedCourses, $failedCourses, $gpa, $status) = $lineArray;
  print <<< HERE
    <tr>
      <td> $studentID </td>
      <td> $fName </td>
      <td> $lName </td>
      <td> $dob </td>
      <td> $completedCourses </td>
      <td> $failedCourses </td>
      <td> $gpa </td>
      <td> $status </td>
    </tr>
HERE;
}

以下是我在CSV文件中的条目: 参赛作品是(学生证,姓名,姓氏,D.O.B,课程已完成,课程失败,GPA,状态)

1, Emma, Zento, 07.03.97, 10, 2, 3.2, Honour,
2, Milo, Aniris, 04.12.02, 6, 0, 5, High Honour,
3, Akatsuki, Sato, 12.12.01, 3, 3, 2.1, Satisfactory,
4, Natsuki, Ito, 01.01.02, 6, 0, 4.0, High Honour,

理想情况下,它应该在uasort函数的帮助下呈现:

2, Milo, Aniris, 04.12.02, 6, 0, 5, High Honour,
4, Natsuki, Ito, 01.01.02, 6, 0, 4.0, High Honour,
1, Emma, Zento, 07.03.97, 10, 2, 3.2, Honour,
3, Akatsuki, Sato, 12.12.01, 3, 3, 2.1, Satisfactory,

不确定这是否被视为一个悬而未决的问题,但我不知道还能在哪里寻求帮助。

1 个答案:

答案 0 :(得分:1)

在输出之前你需要对它进行排序,所以你必须改变你正在做的事情的顺序。获得file()的行后,您可以在行上映射str_getcsv以将字符串转换为数组。

$data = file("../databases/students.csv");
$data = array_map('str_getcsv', $data);

然后$data将能够更轻松地排序。您可以使用usortuasort对此不应该是必需的,因为它看起来不像行索引是有意义的。 uasort中的关联性仅意味着值(行)将与其键保持关联(基于0的索引表示行号)。它与保持每行内的值相互关联无关;排序主数组不会影响它。

6应该是GPA的索引,如果我已经计算正确,并且将$b放在比较的左侧将使排序降序。

usort($data, function($a, $b) {
    return $b[6] <=> $a[6];
});

然后你的输出代码与以前基本相同,只有explode不是必需的,因为这些行已经是数组了。

foreach ($data as $line) {
  list($studentID, $fName, $lName, $dob, $completedCourses, $failedCourses, $gpa, $status) = $line;
  print <<< HERE
    <tr>
      <td> $studentID </td>
      <td> $fName </td>
      <td> $lName </td>
      <td> $dob </td>
      <td> $completedCourses </td>
      <td> $failedCourses </td>
      <td> $gpa </td>
      <td> $status </td>
    </tr>
HERE;
}