1

我有很多日期需要检查。

例如:

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

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

对于上面的示例,算法必须在输出中给出的是:

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

我该怎么做?

谢谢!

4

2 回答 2

2

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

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

)
于 2013-12-18T14:17:56.873 回答
0

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

  1. 遍历数组。
  2. 设置i = 0;count = 0;(计数跟踪活动间隔的数量)
  3. 当您遇到开始时间时,记下它作为i'th 重叠的开始时间。另外,增加计数器count
  4. 当您遇到结束时间时,减少count. 如果count变为零,请注意这是ithinterval 和 increment的结束时间i
于 2013-12-18T14:15:55.733 回答