sensus
@sensus

Как сформировать пересекающиеся периоды?

Приветствую!
Извиняюсь за обращение, у меня головная боль по работе с датами.
Мне надо сделать следующую вещь: если периоды пересекаются, то надо их разделить.
Входящие данные (для примера, в реальности объекты datetime)
[
    0 => ['openDate' => "2018-05-15", 'closeeDate' => "2018-05-30", "item" => 77],
    1 => ['openDate' => "2018-05-20", 'closeeDate' => "2018-05-25", "item" => 60]
]


В данном примере, первый период надо разделить на два (key: 0, 2).
Т.е. на выходе получить
[
    0 => ['openDate' => "2018-05-15", 'closeeDate' => "2018-05-19", "item" => 77]
    1 => ['openDate' => "2018-05-20", 'closeeDate' => "2018-05-25", "item" => 60],
    2 => ['openDate' => "2018-05-26", 'closeeDate' => "2018-05-30", "item" => 77],
]


Можете подкинуть алгоритм?
Спасибо.

UPD
Разбивать периоды по каждому дню не вариант. Могут прийти десятки массивов, в которых периоды на год или два.
Я пока вижу вариант, искать пересечение (это просто). А как дальше сформировать требуемые периоды. Т.е. подробить.
  • Вопрос задан
  • 106 просмотров
Решения вопроса 2
OKyJIucT
@OKyJIucT
Sunshine reggae
Каждый диапазон разбить на массив с днями, потом перебирать первый массив и искать значение во втором. Если есть - создавать третий (между первыми двумя) и перенести значение туда, попутно удаляя значение элемента из обоих массивов.

В конце собрать из каждого диапазона массив в исходном формате, используя первый и последний элемент.

Функция для создания массива с датами из диапазона

$from = new \DateTime('2014-01-01');
$to = new \DateTime('2015-11-01');
 
$period = new \DatePeriod($from, new \DateInterval('P1D'), $to);
 
$arrayOfDates = array_map(
    function ($item) {
        return $item->format('Y-m-d');
    },
    iterator_to_array($period)
);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
еще вариант собрать все в один массив

исходные данные
$days = [2018-05-15, 2018-05-30, 2018-05-20, 2018-05-25];
далее сортируем по возрастанию

после чего берем первый элемент и второй -1 день, затем второй и 3-1 день и т.д.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
от 2 000 до 4 000 usd.
Teamlead Краснодар
До 100 000 руб.
HTML Academy Санкт-Петербург
от 130 000 до 140 000 руб.
19 авг. 2018, в 00:49
600 руб./в час
18 авг. 2018, в 17:54
6000 руб./за проект
18 авг. 2018, в 16:00
60000 руб./за проект