function merge_ranges(array $ranges): array
{
// Sort by the first element of each range
usort($ranges, function ($a, $b) {
return $a[0] <=> $b[0];
});
$merged = [];
foreach ($ranges as [$start, $end]) {
if (empty($merged) || $start > $merged[count($merged) - 1][1]) {
$merged[] = [$start, $end];
} else {
$lastIndex = count($merged) - 1;
$merged[$lastIndex][1] = max($merged[$lastIndex][1], $end);
}
}
return $merged;
}
$ranges = [
[302, 447],
[488, 489],
[121, 234],
[200, 421],
[140, 354]
];
print_r(merge_ranges($ranges));
/*
run:
Array
(
[0] => Array
(
[0] => 121
[1] => 447
)
[1] => Array
(
[0] => 488
[1] => 489
)
)
*/