PHP日历系统实现按用户ID生成唯一行并关联对应数据的问题
解决方案
问题根源
你的$stuArr数组现在是每条日程对应一条记录,如果同一个用户有多个日程,就会在$stuArr里生成多个同ID的元素,渲染时自然输出多行。我们需要先按用户ID对数据做分组,再渲染。
第一步:修改数据构造逻辑(补充代码部分)
把原来追加到$stuArr的逻辑改成按ID分组存储,同一个用户的所有日程日期和对应内容存在同一个结构里:
// 先初始化一个空的分组数组,用用户ID做键 $stuGroup = []; foreach($data as $student) { $id = $student->id; $name = $student->name; // 如果分组里还没有这个用户,先初始化结构 if(!isset($stuGroup[$id])) { $stuGroup[$id] = [ 'id' => $id, 'name' => $name, 'date_map' => [] // 键是日期数字,值是对应要显示的时间+状态 ]; } foreach($data2 as $cal) { if($cal->resource == $id) { $start = new DateTime(substr($cal->start, 0, 10)); $end = new DateTime(substr($cal->end, 0, 10)); $end = $end->modify( '+1 day' ); $interval = new DateInterval('P1D'); $period = new DatePeriod($start, $interval ,$end); $time = $cal->time; $state = $cal->state; $show_content = $time . $state; // 提前拼好要显示的内容 if($month == $start->format('n')) { foreach ($period as $dt) { if($month != $dt->format('n')) break; $day_num = $dt->format("j"); // 把对应日期的内容存到用户的date_map里 // 如果同一天有多条日程需要同时显示,可以把=改成.=拼接内容 $stuGroup[$id]['date_map'][$day_num] = $show_content; } } } } }
第二步:修改表格渲染逻辑
遍历分组后的$stuGroup数组,每个用户只输出一行,循环日期时从date_map里取对应内容即可,同时修正你原来代码里</t>的笔误为</td>:
foreach($stuGroup as $student) { $id = $student['id']; $name = $student['name']; $date_map = $student['date_map']; echo "<tr>"; echo "<td>".$id."</td>"; echo "<td>".$name."</td>"; for ($j = 1; $j <= $days_in_month; $j++) { // 有对应日期的内容就输出,没有就输出空格 if(isset($date_map[$j])) { echo "<td>".$date_map[$j]."</td>"; } else { echo "<td> </td>"; } } echo "</tr>"; }
内容的提问来源于stack exchange,提问作者Fynn
相关产品推荐
相关产品推荐

