我正在尝试按降序排列每个学生的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,
不确定这是否被视为一个悬而未决的问题,但我不知道还能在哪里寻求帮助。
答案 0 :(得分:1)
在输出之前你需要对它进行排序,所以你必须改变你正在做的事情的顺序。获得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;
}