PHP 中实现多维数组按指定字段升序/降序排序的完整教程

1次阅读

PHP 中实现多维数组按指定字段升序/降序排序的完整教程

本文详解如何在 php 中通过表单按钮动态对 json 格式的多维数组(如学生成绩数据)按 nilai_pengetahuan 字段进行升序或降序排序,并安全渲染到 HTML 表格中。

本文详解如何在 php 中通过表单按钮动态对 json 格式的多维数组(如学生成绩数据)按 `nilai_pengetahuan` 字段进行升序或降序排序,并安全渲染到 html 表格中。

在 Web 应用中,常需根据用户操作对数据列表进行实时排序。例如,展示学生成绩时提供“升序”和“降序”按钮,按知识分(nilai_pengetahuan)重新排列表格。但若将 foreach 循环置于条件判断之前(如原始代码),会导致排序逻辑失效——因为数据始终以原始顺序遍历,排序结果未被应用。

✅ 正确执行流程:先排序,再输出

核心原则是:必须在调用 usort() 完成排序后,再遍历并渲染数组。以下是结构清晰、生产可用的完整实现:

<!-- 排序控制表单 --> <form method="post">   <input type="submit" name="asc" value="Ascending" class="btn btn-primary">   <input type="submit" name="desc" value="Descending" class="btn btn-primary"> </form>  <?php // 1. 安全读取并解析 JSON 数据 $jsonFile = 'array.txt'; if (!file_exists($jsonFile)) {     die('Error: Data file not found.'); } $jsonContent = file_get_contents($jsonFile); $nilai = json_decode($jsonContent, true);  // 验证 JSON 解析是否成功 if (json_last_error() !== JSON_ERROR_NONE || !is_array($nilai)) {     die('Error: Invalid or empty JSON data.'); }  // 2. 根据表单提交执行对应排序(注意:此处不输出,仅修改 $nilai) if (isset($_POST['asc'])) {     usort($nilai, function($a, $b) {         // 强制转为整数,避免字符串比较(如 "98" < "23")         return (int)$a['nilai_pengetahuan'] <=> (int)$b['nilai_pengetahuan'];     }); } elseif (isset($_POST['desc'])) {     usort($nilai, function($a, $b) {         return (int)$b['nilai_pengetahuan'] <=> (int)$a['nilai_pengetahuan'];     }); }  // 3. 统一渲染:排序完成后才输出表格 echo '<table class="table table-striped">'; echo '<thead><tr><th>Name</th><th>Knowledge Score</th><th>Skill Score</th></tr></thead>'; echo '<tbody>';  foreach ($nilai as $value) {     echo '<tr>';     echo '<td>' . htmlspecialchars($value['nama']) . '</td>';     echo '<td>' . (int)$value['nilai_pengetahuan'] . '</td>';     echo '<td>' . (int)$value['nilai_keterampilan'] . '</td>';     echo '</tr>'; }  echo '</tbody></table>'; ?>

? 关键注意事项

  • 顺序不可颠倒:usort() 必须在 foreach 之前执行,否则排序无效;
  • 类型安全:使用 (int) 强制转换确保数值比较(避免 “100” 被当作字符串与 “23” 比较);
  • xss 防护:对输出到 HTML 的用户数据(如 $value[‘nama’])使用 htmlspecialchars();
  • 错误处理:检查文件存在性及 JSON 有效性,防止空数据或解析失败导致白屏;
  • 表单方法统一:使用 method=”post” 并通过 $_POST 检测按钮提交,避免 GET 参数污染 URL。

? 进阶建议

  • 可扩展为单按钮切换(如点击一次升序、再点降序),通过会话($_SESSION)记录当前状态;
  • 将排序逻辑封装为函数,支持任意字段(如 nilai_keterampilan)和方向,提升复用性;
  • 结合 ajax 实现无刷新排序,改善用户体验。

遵循以上结构与规范,即可稳定、安全、可维护地实现多维数组的交互式排序功能。

text=ZqhQzanResources