填补时间表中的空白

时间:2018-09-22 06:22:01

标签: php

每日时间表开始于08:30,结束于17:00 (时间以“ nn:nn”开头和“ nn:nn”结尾表示)。

时间段只能在小时的:00,:15,:30,:45开始和结束。

给定的时间表将有零个或多个(不重叠)时间段被预先预订 (具有可变的块大小-从8:30-17:00的一个块中的任何一个;或者可以是15分钟,半小时,多个小时的块等许多小块)。

示例输入:

$schedule = [
    [
        'begin' => '10:00',
        'end' => '12:30'
    ],
    [
        'begin' => '15:15',
        'end' => '16:00'
    ]
];

示例输出:

$gapFiller =
[
    [
        'begin' => '08:30',
        'end' => '10:00'
    ],
    [
        'begin' => '12:30',
        'end' => '15:15'
    ],
    [
        'begin' => '16:00',
        'end' => '17:00'
    ]
];

创建一个函数,该函数返回零个或多个块的数组,以填补预先预订的日程安排中存在的所有空白。在不与其他任何块重叠的情况下,使块的跨度尽可能大。

function fillGaps($schedule){
    //code...

    return $gapFiller;
}

$gapFiller = fillGaps($schedule);

1 个答案:

答案 0 :(得分:1)

此功能将根据不重叠的输入对您提供所需的结果:

function fillGaps($schedule) {
    $gaps = array();
    $time = strtotime('08:30');
    foreach ($schedule as $event) {
        if ($time < strtotime($event['begin']))
            $gaps[] = array('start' => date('H:i', $time), 'end' => $event['begin']);
        $time = strtotime($event['end']);
    }
    if ($time < strtotime('17:00'))
        $gaps[] = array('start' => date('H:i', $time), 'end' => '17:00');
    return $gaps;
}

输出示例数据:

array (
  0 => 
  array (
    'start' => '08:30',
    'end' => '10:00',
  ),
  1 => 
  array (
    'start' => '12:30',
    'end' => '15:15',
  ),
  2 => 
  array (
    'start' => '16:00',
    'end' => '17:00',
  ),
)

rextester上的演示