<?php
function cut($num, $remove_intervals) {
// sort remove intervals by first value
usort($remove_intervals, function($a, $b){return $a[0] <=> $b[0];});
// merge overlapped intervals
$remove = array_reduce(
$remove_intervals,
function($res, $el) {
$cnt = count($res)-1;
if ($el[0] <= $res[$cnt][1]) {
$res[$cnt][1] = max($el[1], $res[$cnt][1]);
} else {
$res[] = $el;
}
return $res;
},
[$remove_intervals[0]]
);
// build result array
$result = array_reduce(
$remove,
function($res, $el) use ($num) {
$cnt = count($res)-1;
if ($el[0] < $res[$cnt][1]) {
$res[$cnt][1] = $el[0];
if ($el[1] < $num) {
$res[] = [$el[1], $num];
}
}
return $res;
},
[[1, $num]]
);
var_export($result);
return $result;
}
print_r(cut(10000, [[30, 500], [700, 900], [800, 1000]]));
print_r(cut(10000, [[30, 500], [1200, 3700], [50, 700], [1000, 3000], [6000, 20000]]));
print_r(cut(1000, [[30, 500], [20, 7000], [10, 35]]));