You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

合并数组键为「键区间」的日程数组分组需求

合并数组键为「键区间」的日程数组分组需求

嘿,这个日程分组的需求挺实用的,我给你写一段PHP代码来实现,逻辑清晰易懂,你可以直接用或者按需调整:

<?php
// 原始日程数组
$schedule = [
    1 => '10:00 &mdash; 22:00',
    2 => '10:00 &mdash; 22:00',
    3 => '10:00 &mdash; 00:00',
    4 => '10:00 &mdash; 00:00',
    6 => '10:00 &mdash; 22:00',
    7 => '10:00 &mdash; 18:00, 20:00 &mdash; 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} &mdash; {$prevDay}";
            $grouped[$key] = $currentTime;
        }
        // 更新当前跟踪的时间和起始日期
        $currentTime = $time;
        $startDay = $day;
    }
}

// 处理最后一组数据
if ($currentTime !== null) {
    $lastDay = array_key_last($schedule);
    $key = $startDay === $lastDay ? (string)$startDay : "{$startDay} &mdash; {$lastDay}";
    $grouped[$key] = $currentTime;
}

// 输出结果
print_r($grouped);
?>

代码逻辑说明

  • 第一步用ksort()给原始数组按键排序,避免日期乱序导致分组错误;
  • 用三个变量跟踪当前状态:$grouped存最终结果,$currentTime记录当前正在匹配的时间区间,$startDay记录当前分组的起始日期;
  • 遍历过程中,一旦遇到不同的时间区间,就把之前连续相同的日期合并成区间键(如果只有单天就直接用当天),写入结果数组;
  • 遍历结束后,别忘记把最后一组数据也存入结果。

运行这段代码后,你会得到完全符合预期的结果:

Array
(
    [1 &mdash; 2] => 10:00 &mdash; 22:00
    [3 &mdash; 4] => 10:00 &mdash; 00:00
    [6] => 10:00 &mdash; 22:00
    [7] => 10:00 &mdash; 18:00, 20:00 &mdash; 00:00
)

而且这个逻辑也支持3天及以上连续相同时间的情况,比如1-5号都是同一时间,会自动合并成[1 &mdash; 5]作为键,完全满足你的需求。

备注:内容来源于stack exchange,提问作者Viacheslav Ravdin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 08:08:13