
本文详解如何在 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 实现无刷新排序,改善用户体验。
遵循以上结构与规范,即可稳定、安全、可维护地实现多维数组的交互式排序功能。