如何将相同营业时间的连续工作日合并为区间格式展示
营业时间区间合并实现方案
实现思路
- 先过滤掉
active_day=0的非营业日期,不参与合并逻辑 - 初始化临时变量存储当前连续区间的「起始日期」「结束日期」「开门时间」「关门时间」
- 逐个遍历有效营业日期:
- 若当前遍历的日期营业时间和临时存储的营业时间完全一致,更新临时变量的结束日期为当前日期
- 若不一致,将临时变量存储的区间格式化为要求的字符串存入结果集,再用当前日期的信息重置临时变量
- 遍历结束后,将最后一组未存入结果集的区间补入结果集
- 单个日期的区间直接展示日期即可,不需要加连接符
代码实现(PHP版本,适配你给出的数组结构)
function mergeBusinessHours($hoursArr) { $result = []; $currentInterval = null; foreach ($hoursArr as $item) { // 跳过非营业日期 if ($item['active_day'] != 1) { continue; } $timeKey = $item['in_time'] . '|' . $item['out_time']; // 还没有当前区间,初始化 if ($currentInterval === null) { $currentInterval = [ 'start_day' => $item['day'], 'end_day' => $item['day'], 'in_time' => $item['in_time'], 'out_time' => $item['out_time'], 'time_key' => $timeKey ]; continue; } // 营业时间一致,合并区间 if ($currentInterval['time_key'] == $timeKey) { $currentInterval['end_day'] = $item['day']; } else { // 不一致,先把之前的区间存入结果 $result[] = formatInterval($currentInterval); // 重置当前区间 $currentInterval = [ 'start_day' => $item['day'], 'end_day' => $item['day'], 'in_time' => $item['in_time'], 'out_time' => $item['out_time'], 'time_key' => $timeKey ]; } } // 把最后一个区间加入结果 if ($currentInterval !== null) { $result[] = formatInterval($currentInterval); } return $result; } // 格式化区间为要求的输出格式 function formatInterval($interval) { $dayStr = $interval['start_day']; if ($interval['start_day'] != $interval['end_day']) { $dayStr .= '-' . $interval['end_day']; } return $dayStr . ' ' . $interval['in_time'] . '-' . $interval['out_time']; } // 测试调用 $businessHours = [ ['day' => 'Sunday', 'in_time' => '', 'out_time' => '', 'active_day' => 0], ['day' => 'Monday', 'in_time' => '10:00', 'out_time' => '18:00', 'active_day' => 1], ['day' => 'Tuesday', 'in_time' => '10:00', 'out_time' => '18:00', 'active_day' => 1], ['day' => 'Wednesday', 'in_time' => '12:00', 'out_time' => '16:00', 'active_day' => 1], ['day' => 'Thursday', 'in_time' => '12:00', 'out_time' => '16:00', 'active_day' => 1], ['day' => 'Friday', 'in_time' => '10:00', 'out_time' => '19:00', 'active_day' => 1], ['day' => 'Saturday', 'in_time' => '', 'out_time' => '', 'active_day' => 0], ]; print_r(mergeBusinessHours($businessHours));
输出结果
Array ( [0] => Monday-Tuesday 10:00-18:00 [1] => Wednesday-Thursday 12:00-16:00 [2] => Friday 10:00-19:00 )
内容的提问来源于stack exchange,提问作者Ashlesha Agrawal
相关产品推荐
相关产品推荐

