Как сформировать пересекающиеся периоды?
Насколько я понял получается так
Каждый диапазон разбить на массив с днями, потом перебирать первый массив и искать значение во втором. Если есть - создавать третий (между первыми двумя) и перенести значение туда, попутно удаляя значение элемента из обоих массивов.
В конце собрать из каждого диапазона массив в исходном формате, используя первый и последний элемент.
Функция для создания массива с датами из диапазона$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)
);