
本文详解如何在 php Web 页面中通过点击按钮,对 json 格式存储的多维数组(如学生成绩数据)按 nilai_pengetahuan 字段实时执行升序或降序排序,并安全渲染到 HTML 表格中。
本文详解如何在 php web 页面中通过点击按钮,对 json 格式存储的多维数组(如学生成绩数据)按 `nilai_pengetahuan` 字段实时执行升序或降序排序,并安全渲染到 html 表格中。
在实际开发中,常需对从文件(如 Array.txt)读取的 JSON 数据进行交互式排序。但原始代码存在逻辑顺序错误:foreach 循环在条件判断之前执行,导致无论是否提交排序请求,页面始终显示原始未排序数据;同时缺少表单封装、错误处理与输出安全机制,易引发 xss 风险或运行异常。
以下是经过重构的专业级实现方案:
✅ 正确的执行顺序与结构
必须先完成排序逻辑(usort),再遍历输出。所有 $_POST 判断应在数据渲染前完成,确保 $nilai 始终为最新排序结果。
✅ 完整可运行示例代码
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>学生成绩排序</title> <style> table { border-collapse: collapse; width: 100%; margin-top: 1rem; } th, td { border: 1px solid #ccc; padding: 8px; text-align: left; } th { background-color: #f2f2f2; } </style> </head> <body> <h2>学生成绩列表(按“知识分”排序)</h2> <!-- 排序表单:确保按钮在 POST 上下文中提交 --> <form method="post" style="margin-bottom: 1rem;"> <input type="submit" name="asc" value="↑ 升序(从小到大)" class="btn btn-primary"> <input type="submit" name="desc" value="↓ 降序(从大到小)" class="btn btn-primary"> </form> <?php // 1. 安全读取并解析 JSON 数据 $filePath = 'array.txt'; if (!file_exists($filePath)) { die('<p class="error">错误:数据文件 array.txt 不存在。</p>'); } $jsonContent = file_get_contents($filePath); if ($jsonContent === false) { die('<p class="error">错误:无法读取文件内容。</p>'); } $nilai = json_decode($jsonContent, true); if (json_last_error() !== JSON_ERROR_NONE || !is_array($nilai)) { die('<p class="error">错误:文件内容不是有效的 JSON 数组。</p>'); } // 2. 执行排序逻辑(关键:必须在 foreach 之前!) if (isset($_POST['asc'])) { usort($nilai, function($a, $b) { // 强制转为整数,避免字符串比较(如 "9" > "10") 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']; }); } // 若无 POST 提交,则保持原始顺序(可选:默认按某字段排序) // 3. 安全渲染表格 echo '<table><thead><tr><th>姓名</th><th>知识分(nilai_pengetahuan)</th><th>技能分(nilai_keterampilan)</th></tr></thead><tbody>'; foreach ($nilai as $value) { // 使用 htmlspecialchars 防止 XSS 攻击 $nama = htmlspecialchars($value['nama'] ?? '', ENT_QUOTES, 'UTF-8'); $nilai_pengetahuan = htmlspecialchars((string)($value['nilai_pengetahuan'] ?? 0), ENT_QUOTES, 'UTF-8'); $nilai_keterampilan = htmlspecialchars((string)($value['nilai_keterampilan'] ?? 0), ENT_QUOTES, 'UTF-8'); echo "<tr> <td>{$nama}</td> <td>{$nilai_pengetahuan}</td> <td>{$nilai_keterampilan}</td> </tr>"; } echo '</tbody></table>'; ?> </body> </html>
⚠️ 关键注意事项
- 执行时序不可颠倒:usort() 必须在 foreach 渲染前调用,否则排序无效;
- 类型安全:使用 (int) 显式转换数值字段,避免 “23” 和 “98” 的字典序比较错误;
- 输入验证:始终检查 JSON 解析结果与文件可读性,防止空数组或解析失败导致致命错误;
- XSS 防护:对所有输出到 HTML 的变量使用 htmlspecialchars() 转义;
- 表单完整性:按钮必须包裹在
- 空值容错:使用 ?? 运算符处理可能缺失的数组键,提升健壮性。
? 进阶提示:如需支持多字段排序(如先按知识分、再按姓名),可扩展 usort 回调函数;若数据量大,建议迁移到数据库并使用 ORDER BY + ajax 实现无刷新排序。
立即学习“PHP免费学习笔记(深入)”;
通过以上结构化实现,你将获得一个稳定、安全、符合 Web 最佳实践的 PHP 排序功能模块。