php - 使用 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,
不确定这是否被认为是一个悬而未决的问题,但我不知道在哪里可以寻求帮助。
解决方案
您需要在输出之前对其进行排序,因此您必须稍微改变一下您正在做的事情的顺序。获得带有 的行后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;
}
推荐阅读
- javascript - 使用参数从 React Navigation 导航器内部调用组件函数
- php - 为什么数据库密码以纯文本形式存储在 WordPress 中的 wp-config.php 中,安全问题?
- css - 当我在 Chrome 中调整窗口大小时显示网格卡被剪切
- javascript - 将百分比相关验证添加到 html 输入框
- python - 根据数据框中的内容从 SQL Server 中删除行
- javascript - JAVASCRIPT 在用户 SCROLL DOWN 和 SCROLL TOP 时执行函数
- python - 如何在 python-telegram-bot 中获取 file_id(语音)?
- objective-c - 当我已经有 %end 时,如何修复“警告:缺少 %end(在 Tweak.x:14 打开的%hook 扩展到 EOF)”错误
- javascript - 如何通过 TTML 浏览并将所有时间\标题放入 JSON 文件
- python - 如何使用 CBV 或 FBV 从选定的表单中获取数据