
本文教你如何在遍历事件时段数据时,避免重复输出相同日期,仅在日期变更时显示一次日期标题,并将同日的所有时段归入对应表格中,实现清晰的分组展示效果。
本文教你如何在遍历事件时段数据时,避免重复输出相同日期,仅在日期变更时显示一次日期标题,并将同日的所有时段归入对应表格中,实现清晰的分组展示效果。
在开发活动预约、课程排期或会议时段管理等功能时,常需将时间数据按「日期」分组展示:每个日期作为独立区块(如 <section>),其下嵌套该日所有可用时段(如多个 <tr> 行)。但原始 foreach 循环会为每条记录重复渲染日期,导致结构混乱、语义不清。解决关键在于状态追踪 + 条件渲染——即用一个变量记录当前处理的日期,仅当日期变化时才输出新的日期标题。
以下是一个完整、健壮且可直接集成的 PHP 实现方案:
✅ 核心逻辑:日期去重与分组渲染
<?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 "</tbody></table>\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>";
}
?>⚠️ 注意事项与最佳实践
-
数据预排序是前提:上述逻辑依赖 $eventSlotInfo 按 slot_date 升序排列。若数据无序,请在查询层添加 ORDER BY slot_date,或在 PHP 中用 usort() 排序:
usort($eventSlotInfo, function($a, $b) { return strcmp($a['slot_date'], $b['slot_date']); }); -
日期格式统一:使用 strtotime() + date() 提取标准日期,比 explode(' ', ...) 更安全(避免空格异常、时区偏差)。
立即学习“PHP免费学习笔记(深入)”;
HTML 语义完整性:确保每个 <table> 都有正确闭合标签(特别是循环末尾的 </tbody></table></section>),否则页面渲染可能错乱。
-
扩展性建议:如需统计每日期的总注册数等聚合数据,可在循环中用关联数组累加:
$stats[$datePart]['registrations'] += (int)$slot['slot_limit'];
通过该方法,你不仅能优雅解决“日期重复显示”问题,还能构建出结构清晰、易于维护、符合前端组件化思维的动态时段展示模块。



















