3v4l.org

run code in 300+ PHP versions simultaneously
<?php $bookings = [ '2017-02-03', '2017-02-24', '2017-04-01', '2017-04-02', '2017-04-03', '2017-04-04', '2017-04-05', '2017-04-06', '2017-04-07', '2017-04-08', '2017-04-09', '2017-04-10', '2017-04-11', '2017-04-12', '2017-04-13', '2017-04-14', '2017-04-15', '2017-04-16', '2017-04-17', '2017-04-18', '2017-04-19', '2017-04-20', '2017-04-21', '2017-04-22', '2017-04-23', '2017-04-24', '2017-04-25', '2017-04-26', '2017-04-27', '2017-04-28', '2017-04-29', '2017-04-30', ]; $date = '2017-02-15'; $end = '2017-05-07'; function isBooked(array &$bookings, string $date): bool { foreach ($bookings as $i => $taken) { if ($date > $taken) { unset($bookings[$i]); } else { return $date === $taken; } } return false; } $result = []; $temp = []; while ($date <= $end) { $exclude = isBooked($bookings, $date); if ($temp) { if ($exclude) { $result[] = implode(' to ', $temp); $temp = []; } elseif ($date != date('Y-m-d', strtotime($temp[1] . ' +1 day'))) { $result[] = implode(' to ', $temp); $temp = [$date, $date]; } else { $temp[1] = $date; } } elseif (!$exclude) { $temp = [$date, $date]; } $date = date('Y-m-d', strtotime($date . ' +1 day')); } if ($temp) { $result[] = implode(' to ', $temp); } var_export($result);

preferences:
80.9 ms | 1136 KiB | 5 Q