
本文详解如何在 php 中通过表单按钮动态对 json 格式多维数组(如学生成绩数据)按 nilai_pengetahuan 字段进行升序或降序排序,并安全渲染到 html 表格中。
本文详解如何在 php 中通过表单按钮动态对 json 格式多维数组(如学生成绩数据)按 nilai_pengetahuan 字段进行升序或降序排序,并安全渲染到 html 表格中。
在 Web 应用中,常需对前端展示的数据(如学生名单、商品列表等)提供交互式排序功能。本教程以一个典型的学生成绩 JSON 数组为例,演示如何使用纯 PHP 实现基于表单提交的服务端动态排序——点击“升序”或“降序”按钮后,页面重新加载并按 nilai_pengetahuan(知识得分)字段重新排列数据。
✅ 正确执行顺序:先排序,再输出
关键逻辑在于:必须在调用 foreach 渲染表格前完成排序操作。原始代码中将 foreach 放置在条件判断之前,导致无论是否提交按钮,都输出原始未排序数据;而排序后的 $nilai 数组并未被后续使用。修正后的结构应严格遵循:
- 读取并解析 JSON 文件;
- 检查 POST 请求,执行对应排序;
- 最后统一遍历已排序数组并输出 HTML。
以下是完整、可直接运行的示例代码(含 HTML 表单与 PHP 逻辑):
<!DOCTYPE html>
<html>
<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; }
.btn { padding: 6px 12px; margin-right: 8px; cursor: pointer; }
</style>
</head>
<body>
<h2>学生成绩列表(按知识得分排序)</h2>
<form method="post">
<input type="submit" name="asc" value="↑ 升序" class="btn btn-primary">
<input type="submit" name="desc" value="↓ 降序" class="btn btn-primary">
</form>
<?php
// 1. 安全读取并解析 JSON 数据
$jsonFile = 'array.txt';
if (!file_exists($jsonFile)) {
die('<p style="color:red;">错误:文件 array.txt 不存在。</p>');
}
$jsonContent = file_get_contents($jsonFile);
if ($jsonContent === false) {
die('<p style="color:red;">错误:无法读取 array.txt 文件。</p>');
}
$nilai = json_decode($jsonContent, true);
if (json_last_error() !== JSON_ERROR_NONE) {
die('<p style="color:red;">错误:array.txt 内容不是有效 JSON 格式。</p>');
}
// 2. 根据表单提交执行排序(注意:此处不 echo,仅修改 $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. 统一渲染表格(始终基于当前已排序的 $nilai)
?>
<table>
<thead>
<tr>
<th>姓名</th>
<th>知识得分(nilai_pengetahuan)</th>
<th>技能得分(nilai_keterampilan)</th>
</tr>
</thead>
<tbody>
<?php foreach ($nilai as $value): ?>
<tr>
<td><?= htmlspecialchars($value['nama']) ?></td>
<td><?= (int)$value['nilai_pengetahuan'] ?></td>
<td><?= (int)$value['nilai_keterampilan'] ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</body>
</html>⚠️ 关键注意事项
- 安全性优先:使用 htmlspecialchars() 转义输出内容,防止 XSS;对数值字段强制 (int) 类型转换,避免因字符串比较导致逻辑错误(例如 "100"
- JSON 验证不可省略:json_decode() 后务必检查 json_last_error(),否则无效 JSON 将返回 null,后续 usort 或 foreach 会触发警告。
- 表单方法必须为 POST:确保使用
- 无 JavaScript 依赖:本方案为传统服务端排序,适合简单场景;如需无刷新体验,可后续结合 AJAX + JSON API 优化。
✅ 总结
只需三步即可实现稳定可靠的多维数组动态排序:① 解析数据 → ② 条件触发 usort()(配合太空船操作符 和类型强转)→ ③ 统一渲染。掌握此模式后,可轻松扩展至按其他字段(如 nama 字母序)或复合条件排序,是 PHP 数据展示层的基础核心技能。
立即学习“PHP免费学习笔记(深入)”;











