How to merge overlapping ranges (start,end),(start,end) in PHP

1 Answer

0 votes
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
        )

)

*/

 



answered Jan 26 by avibootz
edited Jan 28 by avibootz
...