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);
Output for 8.0.1 - 8.0.30, 8.1.0 - 8.1.34, 8.2.0 - 8.2.30, 8.3.0 - 8.3.30, 8.4.1 - 8.4.18, 8.5.0 - 8.5.3
array ( 0 => '2017-02-15 to 2017-02-23', 1 => '2017-02-25 to 2017-03-31', 2 => '2017-05-01 to 2017-05-07', )

preferences:
82.05 ms | 1132 KiB | 4 Q