PHP二维数组按日期范围拆分:新增单日字段并重复子数组
问题修正方案
问题原因
你遇到的问题核心是没有正确将每个日期对应的展览数据追加到结果数组,而是重复覆盖了同一个位置的元素。遍历日期时能输出所有日期,说明日期范围的生成逻辑是正常的,但结果数组的存储逻辑有误。
修正后的代码示例(PHP)
// 初始化处理后的结果数组 $processedExhibitions = []; foreach ($exhibitions as $exhibition) { // 转换起止日期为DateTime对象,方便日期遍历 $startDate = new DateTime($exhibition['start_date']); $endDate = new DateTime($exhibition['end_date']); // 遍历日期范围内的每一天 while ($startDate <= $endDate) { // 复制原展览数组,确保每个日期的条目独立 $dailyExhibition = $exhibition; // 新增date字段,存储当前单日的格式化日期 $dailyExhibition['date'] = $startDate->format('Y-m-d'); // 将单日展览数据追加到结果数组末尾 $processedExhibitions[] = $dailyExhibition; // 日期递进1天 $startDate->modify('+1 day'); } }
关键修正点
- 独立复制数组:每次循环日期时,将原展览数组复制到新变量
$dailyExhibition,避免修改原数据或出现元素覆盖的情况。 - 追加而非覆盖:使用
$processedExhibitions[] = $dailyExhibition将新条目追加到结果数组,而非用固定键名赋值(如$processedExhibitions[$id] = ...),确保每个日期的条目都被保留。 - 日期遍历逻辑:保持原有的日期递进逻辑,确保覆盖从
start_date到end_date的所有日期(包含首尾两天)。
验证示例
假设原数组为:
$exhibitions = [ [ 'title' => '当代艺术展', 'venue' => '城市美术馆', 'start_date' => '2024-05-01', 'end_date' => '2024-05-03' ] ];
处理后$processedExhibitions会包含3个条目,每个条目对应一个日期,且各自拥有独立的date字段。
内容的提问来源于stack exchange,提问作者Hibernacle
相关产品推荐
相关产品推荐

