
本文详解如何在 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 排序功能模块。











