Предположим, у нас есть "большой" диапазон дат и времени, например
$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, любое собственное решение для этого, или мне следует проанализировать всю структуру и сделать дыры самостоятельно? Я не люблю изобретать велосипед.
Есть идеи, как это сделать в лучшем случае? Я думал преобразовать все в метку времени, а затем прокрутить их






Я мало знаю об углероде, но я знаю, что 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;
}
}
Спасибо. Я постараюсь как можно скорее
Для чего-то столь уникального не будет собственного решения.