
本文教你如何在遍历事件时段数据时,避免重复输出相同日期,仅在日期变更时显示一次日期标题,并将同日的所有时段归入对应表格中,实现清晰的分组展示效果。
本文教你如何在遍历事件时段数据时,避免重复输出相同日期,仅在日期变更时显示一次日期标题,并将同日的所有时段归入对应表格中,实现清晰的分组展示效果。
在开发活动预约、课程排期或会议时段管理等功能时,常需将时间数据按「日期」分组展示:每个日期作为独立区块(如 以下是一个完整、健壮且可直接集成的 PHP 实现方案: 数据预排序是前提:上述逻辑依赖 $eventSlotInfo 按 slot_date 升序排列。若数据无序,请在查询层添加 ORDER BY slot_date,或在 PHP 中用 usort() 排序: 日期格式统一:使用 strtotime() + date() 提取标准日期,比 explode(' ', ...) 更安全(避免空格异常、时区偏差)。 HTML 语义完整性:确保每个 扩展性建议:如需统计每日期的总注册数等聚合数据,可在循环中用关联数组累加: 通过该方法,你不仅能优雅解决“日期重复显示”问题,还能构建出结构清晰、易于维护、符合前端组件化思维的动态时段展示模块。 行)。但原始 foreach 循环会为每条记录重复渲染日期,导致结构混乱、语义不清。解决关键在于状态追踪 + 条件渲染——即用一个变量记录当前处理的日期,仅当日期变化时才输出新的日期标题。 ✅ 核心逻辑:日期去重与分组渲染
<?php $eventSlotInfo = $block->getEventSlotDetails();
$currDate = null;
foreach ($eventSlotInfo as $slot) {
// 提取日期部分(兼容 'Y-m-d H:i:s' 格式)
$datePart = date('Y-m-d', strtotime($slot['slot_date']));
// ✨ 仅当日期切换时,开启新日期区块
if ($datePart !== $currDate) {
// 关闭前一个日期的 slot 表格(如已开启)
if ($currDate !== null) {
echo "\n";
}
// 渲染新日期标题区块(含日期表头)
$formattedDate = date('d-m-Y', strtotime($slot['slot_date']));
echo "<section class="slot_blk">";
echo "<table class="cst_table header_table">";
echo "<thead><tr>
<th>Date</th>
<th>Total Registrations</th>
<th>Total Attended</th>
<th>Not Attended</th>
<th>Status</th>
</tr></thead>";
echo "<tbody><tr>
<td>{$formattedDate}</td>
<td>—</td>
<td>—</td>
<td>—</td>
<td class="live">Live</td>
</tr></tbody>";
echo "</table>";
// 开启该日期对应的时段子表
echo "<table class="cst_table">";
echo "<thead><tr>
<th>Slot Time</th>
<th>No. of Registrations</th>
<th>Attended</th>
<th>Not Attended</th>
<th>Action</th>
</tr></thead>";
echo "<tbody>";
$currDate = $datePart;
}
// ✅ 渲染当前时段行(始终执行)
$startTime = $slot['slot_start_time'];
$endTime = $slot['slot_end_time'];
echo "<tr>";
echo "<td>{$startTime} – {$endTime}</td>";
echo "<td>—</td>
<td>—</td>
<td>—</td>";
echo "<td class="action"><a href="#">View</a></td>";
echo "</tr>";
}
// ? 关闭最后一个日期的表格(重要!)
if ($currDate !== null) {
echo "</tbody>
</table></section>";
}
?>
⚠️ 注意事项与最佳实践
usort($eventSlotInfo, function($a, $b) {
return strcmp($a['slot_date'], $b['slot_date']);
});
都有正确闭合标签(特别是循环末尾的
),否则页面渲染可能错乱。$stats[$datePart]['registrations'] += (int)$slot['slot_limit'];
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











