3v4l.org

run code in 300+ PHP versions simultaneously
<?php $array = [ [ 'name' => 'Event A', 'date' => '2023-02-31' ], [ 'name' => 'Event A', 'date' => '2023-03-01' ], [ 'name' => 'Event B', 'date' => '2023-03-02' ], [ 'name' => 'Event C', 'date' => '2023-03-03' ], [ 'name' => 'Event D', 'date' => '2023-04-07' ], [ 'name' => 'Event E', 'date' => '2023-04-08' ], [ 'name' => 'Event E', 'date' => '2023-04-09' ], [ 'name' => 'Event E', 'date' => '2023-04-19' ], [ 'name' => 'Event E', 'date' => '2023-04-20' ], [ 'name' => 'Event E', 'date' => '2023-04-24' ], ]; $result = []; $last = []; foreach ($array as ['date' => $date]) { sscanf($date, '%d-%d-%d', $y, $m, $d); $key = $y . $m; // group by year-month if (isset($last[$key])) { $lastPadded = sprintf('%02s', $last[$key]); $thisPadded = sprintf('%02s', $d); if (($d - 1) === $last[$key]) { $result[$key] = preg_replace("~-$lastPadded\b|\b$lastPadded\b\K~", "-$thisPadded", $result[$key]); // hyphenate } else { $result[$key] = preg_replace("~\b$lastPadded\b\K~", ", $thisPadded", $result[$key], 1); // comma-separate } } else { $result[$key] = sprintf('%02s / %02s / %d', $d, $m, $y); // push initial string for year-month } $last[$key] = $d; } echo implode(", ", $result);
Output for 8.0.1 - 8.0.30, 8.1.0 - 8.1.33, 8.2.0 - 8.2.29, 8.3.0 - 8.3.27, 8.4.1 - 8.4.14
31 / 02 / 2023, 01-03 / 03 / 2023, 07-09, 19-20, 24 / 04 / 2023

preferences:
93.34 ms | 406 KiB | 5 Q