2017-02-13 634 views
3

我有一個時間戳和持續時間數組以及佔用的時間戳數組。 我現在需要檢查這些時間戳是否發生碰撞。如果時間戳範圍在時間戳範圍內

基本上$啓動[]不能內任何$佔用[]時間戳

$start[0] = 1486987200; // 12:00 
$duration[0] = 3600; 

$start[1] = 1487008800; // 18:00 
$duration[1] = 7200; 

$occupied[0] = 1486989000; // 12:30 
$ocDuration[0] = 3600; 

$occupied[1] = 1487019600; // 21:00 
$ocDuration[1] = 7200; 

從上述$start[0]是不可能的,因爲$occupied[0]是它的取值範圍爲1小時(3600秒)的範圍內,但$start[1]是可能的,因爲它從18:00開始,並在2小時後結束。

enter image description here

另一種情況可能是,當$occupied[0]二者重疊$start[]

enter image description here

所以現在的問題是,我該怎麼辦這樣的檢查?

+0

喜愛的描述和示範 – Ima

+0

對於這種事情的[間隔樹](https://en.wikipedia.org/wiki/Interval_tree)是一種優良的數據結構。我不知道是否有一個PHP的實現;但是我已經在Python庫上成功構建了類似的東西,比如[this](https://pypi.python.org/pypi/intervaltree)。 – deceze

+0

感謝您的回覆。我會研究間隔樹。似乎這可能是未來的好事 – JPJens

回答

0
function checkTimeSlot($occupied, $occDuration, $checkStart, $checkDuration) 
{ 
    $isValid = true; 
    foreach($occupied as $key => $occStartTime) 
    { 
     $occEndTime = $occStartTime + $occDuration; 
     if($checkStart > $occStartTime || $checkStart < $occEnd || $occEndTime > $occStartTime || $occEndTime < $occEndTime) 
     { 
      $isValid = false; 
     } 
    } 

    return $isValid; 
} 


$isValid = []; 
foreach ($start as $key => $checkStart) 
{ 
    $isValid[$key] = checkTimeSlot($checkStart, $duration[$key]); 
} 
1

如果您將$ start和$ duration用作非數組變量,則可以使用下面的這個。否則,只需編寫一個雙重for循環。

$start[0] = 1486987200; // 12:00 
$duration[0] = 3600; 

$start[1] = 1487008800; // 18:00 
$duration[1] = 7200; 

$occupied[0] = 1486989000; // 12:30 
$ocDuration[0] = 3600; 

$occupied[1] = 1487019600; // 21:00 
$ocDuration[1] = 7200; 

$occupied[2] = 1486989000; // 12:30 
$ocDuration[2] = 23400; 

function checkOccupancy($start, $duration, $occupied, $ocDuration){ 
    $ocLength = count($occupied); 
    for($i = 0; $i <= $ocLength; $i++){ 
     $ocEnd = $occupied[$i] + $ocDuration[$i]; 
     $end = $start + $duration; 
     if(($start > $occupied[$i] && $start < $ocEnd) || ($end > $occupied[$i] && $end < $ocEnd)){ 
      return "Not Possible"; 
     } 
    } 
    return "Possible"; 
} 

echo checkOccupancy($start[0], $duration[0], $occupied, $ocDuration); 
echo checkOccupancy($start[1], $duration[1], $occupied, $ocDuration); 
相關問題