使用PHP将学生出勤JSON数据匹配日期展示为表格
问题解决:PHP实现学生出勤记录对应日期列的表格生成
核心需求
通过RESTful API获取学生出勤JSON数据,生成表格时需将每个学生的出勤标记精准对应到对应日期的列中,避免出现列错位、标记不匹配的问题。
示例JSON数据
假设API返回的出勤数据结构如下:
[ { "student_id": 1, "student_name": "张三", "attendance_records": [ {"date": "2024-05-01", "status": "出勤"}, {"date": "2024-05-03", "status": "缺勤"} ] }, { "student_id": 2, "student_name": "李四", "attendance_records": [ {"date": "2024-05-01", "status": "出勤"}, {"date": "2024-05-02", "status": "出勤"}, {"date": "2024-05-03", "status": "出勤"} ] } ]
常见错误原因
多数问题出在未将出勤记录与日期列做映射:直接循环学生的出勤记录输出单元格,会导致无记录的日期列缺失,或标记错位。
正确实现方案
核心逻辑
- 先确定需要展示的日期范围(可固定定义,也可从所有出勤记录中动态提取)
- 将每个学生的出勤记录转换为
日期=>状态的关联数组,实现快速查找 - 循环日期列,对每个日期匹配学生的出勤状态,无记录则显示默认值
完整代码
<?php // 模拟API获取数据(实际项目中替换为curl/file_get_contents调用API) $jsonData = '[ {"student_id":1,"student_name":"张三","attendance_records":[{"date":"2024-05-01","status":"出勤"},{"date":"2024-05-03","status":"缺勤"}]}, {"student_id":2,"student_name":"李四","attendance_records":[{"date":"2024-05-01","status":"出勤"},{"date":"2024-05-02","status":"出勤"},{"date":"2024-05-03","status":"出勤"}]} ]'; $students = json_decode($jsonData, true); // 定义展示的日期范围(也可动态提取,见下方可选优化) $displayDates = ["2024-05-01", "2024-05-02", "2024-05-03"]; // 生成表格 echo '<table border="1" cellpadding="8" cellspacing="0">'; // 输出表头 echo '<tr>'; echo '<th>学生姓名</th>'; foreach ($displayDates as $date) { echo '<th>' . date('m-d', strtotime($date)) . '</th>'; // 格式化日期显示 } echo '</tr>'; // 输出每个学生的出勤行 foreach ($students as $student) { // 转换出勤记录为日期=>状态的映射数组 $attendanceMap = []; foreach ($student['attendance_records'] as $record) { $attendanceMap[$record['date']] = $record['status']; } echo '<tr>'; echo '<td>' . htmlspecialchars($student['student_name']) . '</td>'; // 转义防止XSS // 循环日期列,匹配对应状态 foreach ($displayDates as $date) { $status = isset($attendanceMap[$date]) ? $attendanceMap[$date] : '未打卡'; // 可选:根据状态添加样式,比如缺勤标红 $style = $status === '缺勤' ? 'style="color: red; font-weight: bold;"' : ''; echo '<td ' . $style . '>' . htmlspecialchars($status) . '</td>'; } echo '</tr>'; } echo '</table>'; ?>
可选优化:动态提取日期范围
如果日期不是固定值,可从所有出勤记录中自动提取并排序:
// 从所有出勤记录中提取日期并去重排序 $allDates = []; foreach ($students as $student) { foreach ($student['attendance_records'] as $record) { $allDates[] = $record['date']; } } $displayDates = array_unique($allDates); sort($displayDates); // 按日期升序排列
内容的提问来源于stack exchange,提问作者Tuns
相关产品推荐
相关产品推荐

