2013-12-18 287 views
1

我有很多日期,我需要检查。如何计算多个日期之间的重叠日期范围

例如:

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

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

对于上面的例子,什么ALGOR在输出给是:

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

我该怎么办呢?

谢谢!

+0

如果省略了第一个5位,所以”你会更容易破译你的输出。 –

+0

开始和结束如何存储? – RMK

+0

在mysql数据库中。 – JackTurky

回答

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 
     ) 

) 
+0

好的!与新版本,它运作良好! :) 谢谢!!!! – JackTurky

0

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

  1. 遍历数组。
  2. i = 0;count = 0;(计数跟踪有效时段的数量)
  3. 当你遇到一个开始时间,请记下为i'th重叠的开始时间。另外,增加计数器count
  4. 当您遇到结束时间时,递减count。如果count变为零,请注意此处的结束时间为ith区间并且增量为i