Ежедневное расписание начинается в 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);
php
-2
micahwittman 22 Сен 2018 в 09:22

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

1
Nick 22 Сен 2018 в 06:56