3v4l.org

run code in 300+ PHP versions simultaneously
<?php function rangify(array $dates): string { $lastYm = null; $lastN = null; $result = []; foreach ($dates as $date) { $dt = new DateTime($date); $ym = $dt->format('Y-m'); $j = (int) $dt->format('j'); if ($ym === $lastYm) { if (($j - 1) === $lastN) { $ref = preg_replace('/-\d+$/', '', $ref) . "-$j"; } else { $ref .= ",$j"; } } else { unset($ref); $ref = $dt->format('M') . " $j"; $result[] = &$ref; } $lastYm = $ym; $lastN = $j; } return implode(', ', $result); } $tests = [ ['2015-10-27', '2015-10-28', '2015-10-30', '2015-10-31', '2015-11-01'], ['2015-10-31', '2015-11-01', '2015-11-02'], ['2015-10-26', '2015-10-28', '2015-10-29', '2015-10-31', '2015-11-01'], ]; //Oct 30-31, Nov 01 //Oct 31, Nov 1-2 //Oct 29,31, Nov 1 foreach ($tests as $test) { echo rangify($test) . "\n"; }

preferences:
30.59 ms | 405 KiB | 5 Q