如何计算重叠的多个日期之间的日期范围


How to calculate date range between multiple date that overlaps

我有很多日期需要检查。

例如:

1 - Start: 1387267200, End: 1387274400
2 - Start: 1387270800, End: 1387275000 
3 - Start: 1387250200, End: 1387273000 
4 - Start: 1387285200, End: 1387288800

我需要的是计算每个重叠的最小开始日期和最大结束日期。

对于上面的例子,藻类必须在输出中给出的是:

Start1: 1387250200 -> End1: 1387275000.
Start2: 1387285200 -> End2: 1387288800.

我该怎么做?

谢谢!

此脚本查找重叠的间隔,并获取具有最小开始日期和最大结束日期的新间隔:

// 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
        )
)

对数组中的所有开始和结束时间进行排序。

  1. 循环访问数组。
  2. 设置i = 0;count = 0;(计数跟踪活动间隔的数量)
  3. 当您遇到开始时间时,请记下它作为i'th重叠的开始时间。此外,递增计数器count
  4. 遇到末日时,递减count。如果count变为零,请注意这是间隔ith和增量i的结束时间。