合并数组键为「键区间」的日程数组分组需求
合并数组键为「键区间」的日程数组分组需求
嘿,这个日程分组的需求挺实用的,我给你写一段PHP代码来实现,逻辑清晰易懂,你可以直接用或者按需调整:
<?php // 原始日程数组 $schedule = [ 1 => '10:00 — 22:00', 2 => '10:00 — 22:00', 3 => '10:00 — 00:00', 4 => '10:00 — 00:00', 6 => '10:00 — 22:00', 7 => '10:00 — 18:00, 20:00 — 00:00', ]; $grouped = []; $currentTime = null; $startDay = null; // 先按键排序,确保按日期顺序处理 ksort($schedule); foreach ($schedule as $day => $time) { if ($time !== $currentTime) { // 当前时间和之前的不一样,先把上一组存入结果 if ($currentTime !== null) { $prevDay = $day - 1; $key = $startDay === $prevDay ? (string)$startDay : "{$startDay} — {$prevDay}"; $grouped[$key] = $currentTime; } // 更新当前跟踪的时间和起始日期 $currentTime = $time; $startDay = $day; } } // 处理最后一组数据 if ($currentTime !== null) { $lastDay = array_key_last($schedule); $key = $startDay === $lastDay ? (string)$startDay : "{$startDay} — {$lastDay}"; $grouped[$key] = $currentTime; } // 输出结果 print_r($grouped); ?>
代码逻辑说明
- 第一步用
ksort()给原始数组按键排序,避免日期乱序导致分组错误; - 用三个变量跟踪当前状态:
$grouped存最终结果,$currentTime记录当前正在匹配的时间区间,$startDay记录当前分组的起始日期; - 遍历过程中,一旦遇到不同的时间区间,就把之前连续相同的日期合并成区间键(如果只有单天就直接用当天),写入结果数组;
- 遍历结束后,别忘记把最后一组数据也存入结果。
运行这段代码后,你会得到完全符合预期的结果:
Array ( [1 — 2] => 10:00 — 22:00 [3 — 4] => 10:00 — 00:00 [6] => 10:00 — 22:00 [7] => 10:00 — 18:00, 20:00 — 00:00 )
而且这个逻辑也支持3天及以上连续相同时间的情况,比如1-5号都是同一时间,会自动合并成[1 — 5]作为键,完全满足你的需求。
备注:内容来源于stack exchange,提问作者Viacheslav Ravdin
相关产品推荐
相关产品推荐

