如何用PHP和SQL按月份分组数据、遍历月内日期并切换月份
PHP+SQL按月份分组输出数据的实现方案
你的核心问题是当前循环会为每一条数据生成独立的.month容器,导致同一月份的内容被拆分,需要调整逻辑将同一月份的所有条目合并到同一个容器内。以下是修改后的实现代码:
修改后的完整代码
<?php $query = ' SELECT Creation_date, DATE_FORMAT(Creation_date, "%m") Creation_date_m, DATE_FORMAT(Creation_date, "%M") Creation_date_M_full, DATE_FORMAT(Creation_date, "%Y") Creation_date_Y_full, Project_name FROM Projects ORDER BY Creation_date DESC '; $result = $conn->query($query); $previousMonthYear = null; // 用年月组合做判断,避免同月份不同年份的冲突 ?> <?php while ($row = $result->fetch_assoc()): ?> <?php $month = $row['Creation_date_m']; $monthFull = $row['Creation_date_M_full']; $year = $row['Creation_date_Y_full']; $currentMonthYear = $year . '-' . $month; // 生成唯一的年月标识 // 当月份/年份变化时,闭合上一个容器并开启新容器 if ($currentMonthYear !== $previousMonthYear) { // 如果不是第一条数据,先关闭上一个.month容器 if ($previousMonthYear !== null) { echo '</div>'; } // 输出新的月份容器开头和标题 echo '<div class="month">'; echo '<h2>' . $monthFull . ' ' . $year . '</h2>'; $previousMonthYear = $currentMonthYear; } ?> <div class="day-of-month"><?= $row['Creation_date']; ?></div> <?php endwhile; ?> <?php // 循环结束后,闭合最后一个.month容器 if ($previousMonthYear !== null) { echo '</div>'; } ?>
关键逻辑说明
- 年月组合判断:用
年份-月份的字符串作为唯一标识,避免出现同月份不同年份(如2022年2月和2023年2月)被错误合并的情况。 - 容器的开启与闭合:
- 首次循环或年月变化时,先关闭上一个容器(如果存在),再开启新的
.month容器并输出月份标题。 - 同一年月的条目直接输出
.day-of-month内容,无需重复生成容器。
- 首次循环或年月变化时,先关闭上一个容器(如果存在),再开启新的
- 循环收尾:循环结束后必须手动闭合最后一个
.month容器,避免HTML结构不完整。
输出效果
修改后将生成你期望的结构:
<div class="month"> <h2>February 2023</h2> <div class="day-of-month">2023-02-24</div> <div class="day-of-month">2023-02-22</div> <div class="day-of-month">2023-02-22</div> </div> <div class="month"> <h2>January 2023</h2> <div class="day-of-month">2023-01-28</div> <div class="day-of-month">2023-01-20</div> </div>
内容的提问来源于stack exchange,提问作者Tony Chheng
相关产品推荐
相关产品推荐

