此脚本查找重叠间隔并获取具有最小开始日期和最大结束日期的新间隔:
// Input
$intervals = array(
array(1387267200, 1387274400),
array(1387270800, 1387275000),
array(1387250200, 1387273000),
array(1387285200, 1387288800),
);
// Overlapped intervals
$overlapped = array();
foreach ($intervals as $i => $a) {
$group = [$a];
foreach ($intervals as $j => $b) {
if (
$i !== $j && (($a[0] <= $b[0] && $a[1] >= $b[0])
|| ($a[0] <= $b[1] && $a[0] >= $b[0]))
) {
$group[] = $b;
}
}
sort($group);
$overlapped[] = $group;
}
// Multidimensional array_unique()
$overlapped = array_map('unserialize',
array_unique(array_map('serialize', $overlapped))
);
// Output
$output = array();
// Get min/max dates for each overlapped group
foreach ($overlapped as $group) {
$min = null;
$max = null;
foreach ($group as $interval) {
if ($min === null || $interval[0] < $min) {
$min = $interval[0];
}
if ($max === null || $interval[1] > $max) {
$max = $interval[1];
}
}
$output[] = array($min, $max);
}
print_r($output);
输出:
Array
(
[0] => Array
(
[0] => 1387250200
[1] => 1387275000
)
[1] => Array
(
[0] => 1387285200
[1] => 1387288800
)
)