2017-02-13 16 views
3

私は、タイムスタンプとデュレーションの配列と占有タイムスタンプの配列を持っています。 これらのタイムスタンプが衝突するかどうかを確認する必要があります。タイムスタンプの範囲がタイムスタンプの範囲内にある場合

基本的に$スタート[] $occupied[0]は、1時間(3600秒)のその範囲内にあるので、上記$start[0]から

$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[1]それは18:00から始まり、2時間後に終了するため可能です。 $occupied[0]は両方$start[]重なった場合

enter image description here

別の状況は次のようになります。

enter image description here

そこで問題、どのように私は、このようなチェックを行うことができますか?

+0

は、この種のもの【区間木(https://en.wikipedia.org/wiki/Interval_tree)の説明及び実証 – Ima

+0

は、優れたデータ構造である好き。 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ループを2回書くだけです。

$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); 
関連する問題