Диапазоны DateTime с "дырами"

Предположим, у нас есть "большой" диапазон дат и времени, например

$big = [
   'start' => '2018-09-01 00:00:00',
   'stop'  => '2018-09-01 23:59:59'
]

Мне нужно создать массив со всеми диапазонами, не включенными в другой массив, например:

$exclude = [
   [
      'start' => '2018-09-01 12:00:00',
      'stop'  => '2018-09-01 14:59:59'
   ],
   [
      'start' => '2018-09-01 18:00:00',
      'stop'  => '2018-09-01 19:59:59'
   ]
]

чтобы получившаяся структура была примерно такой:

$results = [
   [
      'start' => '2018-09-01 00:00:00',
      'stop'  => '2018-09-01 11:59:59'
   ],
   [
      'start' => '2018-09-01 15:00:00',
      'stop'  => '2018-09-01 17:59:59'
   ],
   [
      'start' => '2018-09-01 20:00:00',
      'stop'  => '2018-09-01 23:59:59'
   ]
]

tl; dr

У меня большой диапазон дат и времени (например, те, что написаны выше), и мне нужно создать результирующий, удалив один или несколько диапазонов из другой структуры. Что-то вроде извлечения перерывов из рабочего дня с сохранением только реального рабочего времени.

Я использую Carbon и Laravel, любое собственное решение для этого, или мне следует проанализировать всю структуру и сделать дыры самостоятельно? Я не люблю изобретать велосипед.

Для чего-то столь уникального не будет собственного решения.

Devon 08.09.2018 18:28

Есть идеи, как это сделать в лучшем случае? Я думал преобразовать все в метку времени, а затем прокрутить их

Gandalf Corvotempesta 09.09.2018 07:49
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
38
1

Ответы 1

Я мало знаю об углероде, но я знаю, что Carbon расширяет собственный класс DateTime, поэтому следующий код можно адаптировать для достижения вашей цели:

$result=[['start'=>$big['start'],'stop'=>''],['start'=>'','stop'=>''],['start'=>'','stop'=>$big['stop']]];//you can build this with a loop if you want...

foreach($result as $k =>$value){
    switch($k){
        case 0:

            $result[$k]['stop']=(($date=date_create($exclude[0]['start']))&&$date->sub(new dateInterval('PT1S')))?$date->format('Y-m-d H:i:s'):'';
            unset($date);
        break;
        case 1:
            $result[$k]['start']=(($date=date_create($exclude[0]['stop']))&&$date->add(new dateInterval('PT1S')))?$date->format('Y-m-d H:i:s'):'';
            $result[$k]['stop']=(($date=date_create($exclude[1]['start']))&&$date->sub(new dateInterval('PT1S')))?$date->format('Y-m-d H:i:s'):'';
            unset($date);
        break;
        case 2:
            $result[$k]['start']=(($date=date_create($exclude[1]['stop']))&&$date->add(new dateInterval('PT1S')))?$date->format('Y-m-d H:i:s'):'';
            unset($date);
        break;
        default:
        break;
    }
}

Спасибо. Я постараюсь как можно скорее

Gandalf Corvotempesta 17.09.2018 17:18

Другие вопросы по теме