
本文详解如何在 PHP 中通过表单按钮动态对 JSON 格式的多维数组按 nilai_pengetahuan 字段进行升序或降序排序,并安全渲染到 HTML 表格中。
本文详解如何在 php 中通过表单按钮动态对 json 格式的多维数组按 `nilai_pengetahuan` 字段进行升序或降序排序,并安全渲染到 html 表格中。
在 Web 应用中,常需根据用户操作实时调整数据展示顺序。例如,从文件读取学生成绩数据(JSON 格式),并提供“升序”“降序”按钮按知识分(nilai_pengetahuan)重新排列。但若将 foreach 循环置于条件判断之前(如原始代码),会导致排序逻辑失效——页面始终显示原始顺序。核心在于:必须先完成排序逻辑,再统一输出结果。
以下是结构清晰、生产可用的完整实现方案:
✅ 正确执行流程
- 读取并解析 JSON 文件;
- 检查表单提交类型(asc 或 desc),调用 usort() 执行对应排序;
- 最后遍历已排序数组并输出 HTML 表格。
✅ 完整可运行代码示例
<!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>
<h3>学生成绩列表(按知识分排序)</h3>
<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 数据
$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) {
die('<p class="error">错误:array.txt 内容不是有效 JSON 格式。</p>');
}
// 2. 根据表单提交执行排序(注意:此步必须在循环前!)
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'];
});
}
// 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>⚠️ 关键注意事项
- 排序时机不可错位:usort() 必须在 foreach 循环之前执行,否则排序无效;
- 类型安全:使用 (int) 强制转换确保数值比较(避免 "23" 和 "98" 的字典序错误);
- XSS 防护:输出用户数据时务必使用 htmlspecialchars();
- 错误处理:检查文件存在性、读取权限及 JSON 有效性,提升健壮性;
- 表单方法:使用 method="post" 避免 URL 参数污染,且符合状态变更语义。
? 进阶建议
- 可扩展为支持多字段排序(如先按知识分,再按技能分);
- 结合 AJAX 实现无刷新排序,提升用户体验;
- 将排序逻辑封装为函数,便于复用与测试。
通过以上实现,你已掌握 PHP 动态排序的核心模式:数据加载 → 条件处理 → 统一输出。这是构建交互式数据管理界面的基础能力。











