You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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": "出勤"}
        ]
    }
]

常见错误原因

多数问题出在未将出勤记录与日期列做映射:直接循环学生的出勤记录输出单元格,会导致无记录的日期列缺失,或标记错位。

正确实现方案

核心逻辑

  1. 先确定需要展示的日期范围(可固定定义,也可从所有出勤记录中动态提取)
  2. 将每个学生的出勤记录转换为日期=>状态的关联数组,实现快速查找
  3. 循环日期列,对每个日期匹配学生的出勤状态,无记录则显示默认值

完整代码

<?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 07:02:51