3v4l.org

run code in 300+ PHP versions simultaneously
<?php function formatDates($dates) { $output = []; $evening_ranges = []; $matinees = []; $last_evening_date = null; foreach ($dates as $date) { $dateTime = new DateTime($date); $time = $dateTime->format('ga'); if ($time == '2pm') { $matinees[] = $dateTime; } else { if ($last_evening_date && $last_evening_date->modify('+1 day')->format('Y-m-d') != $dateTime->format('Y-m-d')) { if (!empty($evening_ranges)) { $output[] = formatRange($evening_ranges); } $evening_ranges = []; } $evening_ranges[] = $dateTime; $last_evening_date = clone $dateTime; } } if (!empty($evening_ranges)) { $output[] = formatRange($evening_ranges); } foreach ($matinees as $matinee) { $output[] = [$matinee]; } usort($output, function($a, $b) { return $a[0] <=> $b[0]; }); return implode(', ', array_map('formatOutput', $output)); } function formatRange($range) { $start = $range[0]; $end = end($range); if ($start->format('M') == $end->format('M')) { return [$start, $end, $start->format('ga')]; } else { return [$start, $end, $start->format('ga')]; } } function formatOutput($range) { if (count($range) == 1) { return $range[0]->format('jS M ga'); } else { $start = $range[0]; $end = $range[1]; $time = $range[2]; if ($start->format('M') == $end->format('M')) { return $start->format('jS') . '-' . $end->format('jS M') . ' ' . $time; } else { return $start->format('jS M') . '-' . $end->format('jS M') . ' ' . $time; } } } $dates = [ '2014-01-20 20:00:00', '2014-01-21 20:00:00', '2014-01-22 14:00:00', '2014-01-22 20:00:00', '2014-01-23 20:00:00', '2014-01-25 20:00:00', '2014-01-26 20:00:00', '2014-01-31 20:00:00', '2014-02-01 20:00:00' ]; echo formatDates($dates); ?>

preferences:
24.97 ms | 407 KiB | 5 Q