2014-03-14 70 views
2

關於檢查兩個日期之間的重疊有很多帖子。但是我找不到任何關於如何在多個範圍內檢查的內容。檢查多個日期範圍內的重疊

說我有此數組:

$ranges = [ 
array('start'=>'2014-01-01' , 'end'=> '2014-01-05'), 
array('start'=>'2014-01-06' > , 'end'=> '2014-01-10'), 
array('start'=>'2014-01-04' > , 'end'=> '2014-01-07')] 

有人可能會簡單地認爲它會檢查兩個範圍之間重疊的功能,可與所有範圍之間的循環工作,但這是錯誤的,因爲所有的範圍可以重疊與彼此,但不重疊在一起。

我希望有人能幫助我找到一個很好的解決辦法.....

回答

1
<?php 

// pass your ranges to this method and if there is a common intersecion it will 
// return it or false 

function checkIfOverlapped($ranges) 
{ 
    $res = $ranges[0]; 

    $countRanges = count($ranges); 

    for ($i = 1; $i < $countRanges; $i++) { 

     $r1s = $res['start']; 
     $r1e = $res['end']; 

     $r2s = $ranges[$i]['start']; 
     $r2e = $ranges[$i]['end']; 

     if ($r1s >= $r2s && $r1s <= $r2e || $r1e >= $r2s && $r1e <= $r2e || $r2s >= $r1s && $r2s <= $r1e || $r2e >= $r1s && $r2e <= $r1e) { 

      $res = array(
       'start' => $r1s > $r2s ? $r1s : $r2s, 
       'end' => $r1e < $r2e ? $r1e : $r2e 
      ); 

     } else return false; 

    } 

    return $res; 
} 

// example 
$ranges = array(
    array('start' => '2014-01-01', 'end' => '2014-01-05'), 
    array('start' => '2014-01-05', 'end' => '2014-01-10'), 
    array('start' => '2014-01-04', 'end' => '2014-01-07') 
); 

var_dump(checkIfOverlapped($ranges)); 
+0

如果在循環的第一次迭代,不存在重疊,該函數將返回false,並沒有進一步將進行比較。 – cmcnulty

+1

這個功能是找到一個共同的交集,所以如果前兩個沒有交集,那麼它是錯誤的。 –

+0

謝謝你的解釋。我將OP理解爲希望知道*任何*重疊與是否所有*重疊,但重新閱讀它,因此很難確定OP正在尋找哪種情形。 – cmcnulty