Я предполагаю, что 2019 ваш пример является опечаткой, поскольку остальная часть массива отсортирована правильно.
Здесь я сначала проверяю, что первый элемент датирован первым из указанного месяца. Если нет, то это добавляет «начало» месяца.
Затем он входит в l oop и проверяет, есть ли пробел между предметами, и добавляет домашний предмет, если есть пробел.
$arr = array ( 0 => array ( 'datum_od' => '01.01.2020', 'datum_do' => '10.01.2020', ), 1 => array ( 'datum_od' => '15.01.2020', 'datum_do' => '20.01.2020', ), 2 => array ( 'datum_od' => '01.02.2020', 'datum_do' => '05.02.2020', ), 3 => array ( 'datum_od' => '25.11.2020', 'datum_do' => '25.12.2020', ));
$end_date = 0;
if(date('d', strtotime($arr[0]['datum_od'])) != '01'){
$end_date = date('d.m.Y', strtotime($arr[0]['datum_od'] . ' -1 day'));
$new[] = array('datum_od' => date('01.m.Y', strtotime($arr[0]['datum_od'])), 'datum_do' => $end_date, 'home');
}
foreach($arr as $key => $item){
if(date("d.m.Y", strtotime($end_date . " +1 day")) != date('d.m.Y', strtotime($item['datum_od']))){
$end_date = date('d.m.Y', strtotime($item['datum_od'] . ' -1 day'));
$new[] = array('datum_od' => date('d.m.Y', strtotime($arr[$key-1]['datum_do'] . " +1 day")), 'datum_do' => $end_date, 'home');
$new[] = $item;
}else{
$new[] = $item;
}
}
var_dump($new);
https://3v4l.org/lCOGv