首页 > 解决方案 > 使用 uasort() 对 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 文件中的条目:条目是(学生 ID、名字、姓氏、出生日期、完成的课程、失败的课程、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,

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

标签: phpcsv

解决方案


您需要在输出之前对其进行排序,因此您必须稍微改变一下您正在做的事情的顺序。获得带有 的行后file(),您可以映射str_getcsv这些行以将字符串转换为数组。

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

然后$data将能够更容易地进行排序。你可以只使用usort. uasort对此应该没有必要,因为它看起来不像行索引是有意义的。关联性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;
}

推荐阅读