2012-11-22 42 views
-1

我有一個用戶輸入表格,其中用戶以(YYYY-mm-dd)格式選擇日期,並以(H:i)開始時間並以(H:i)格式結束時間,或者假設我有三個變量,以下值。我如何檢測兩個時間段的不重疊?

$date  = '2012-11-22'; 
$startTime = '1:00'; 
$endTime = '4:00'; 

我現在必須將這個值與現有的值數組進行比較。我現有的陣列看起來像這樣。

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [start_datetime] => 2012-11-22 02:30:00 
      [end_datetime] => 2012-11-22 05:00:00 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [start_datetime] => 2012-11-22 00:00:00 
      [end_datetime] => 2012-11-22 02:30:00 
     ) 

    [2] => Array 
     (
      [id] => 3 
      [start_datetime] => 2012-11-22 05:00:00 
      [end_datetime] => 2012-11-22 08:00:00 
     ) 

    [3] => Array 
     (
      [id] => 4 
      [start_datetime] => 2012-11-22 08:00:00 
      [end_datetime] => 2012-11-22 11:00:00 
     ) 

    [4] => Array 
     (
      [id] => 5 
      [start_datetime] => 2012-11-22 11:00:00 
      [end_datetime] => 2012-11-22 17:00:00 
     ) 

) 

我必須檢查用戶輸入選擇[日期,開始時間,和endTime]具有任何時隙的給定陣列中已經預定的時隙。從我看到的解決方案是首先拆分並匹配日期,如果匹配日期那麼時間需要相應匹配。我很困惑如何去與它。我希望從你們那裏得到一些簡單的解決方案:)

謝謝。

更新: 我試過這樣做。

$arenaSurfaceBooking = array(
    array(
     'id' => 1, 
     'start_datetime' => '2012-11-22 02:30:00', 
     'end_datetime' => '2012-11-22 05:00:00', 
    ), 
    array(
     'id' => 2, 
     'start_datetime' => '2012-11-22 00:00:00', 
     'end_datetime' => '2012-11-22 02:30:00', 
    ), 
    array(
     'id' => 3, 
     'start_datetime' => '2012-11-22 05:00:00', 
     'end_datetime' => '2012-11-22 08:00:00', 
    ), 
    array(
     'id' => 4, 
     'start_datetime' => '2012-11-22 08:00:00', 
     'end_datetime' => '2012-11-22 11:00:00', 
    ), 
    array(
     'id' => 5, 
     'start_datetime' => '2012-11-22 11:00:00', 
     'end_datetime' => '2012-11-22 17:00:00', 
    ) 
); 

foreach($arenaSurfaceBooking as $booking) { 
    $bookedDateTimestamp = strtotime(date('Y-m-d', strtotime($booking['start_datetime']))); 
    $inputDateTimestamp = strtotime($context['date']); 
    $bookedStartTime  = strtotime(date('H:i', strtotime($booking['start_datetime']))); 
    $bookedEndTime  = strtotime(date('H:i', strtotime($booking['end_datetime']))); 
    $userStartTime  = strtotime(date('H:i', strtotime($context['start_datetime']))); 
    $userEndTime   = strtotime(date('H:i', strtotime($context['end_datetime']))); 
    if($bookedDateTimestamp == $inputDateTimestamp) { 
     if($userEndTime <= $bookedStartTime || $userStartTime >= $bookedEndTime) { 
      echo 'i am booked'; 
     } 
    } 
} 

它不工作。

+0

我希望我沒有複雜的問題,如果你不明白,請讓我知道虐待嘗試以更好的方式解釋它。 –

+1

什麼/您是如何嘗試的? – Leri

+0

@PLB我試着分開日期並首先比較日期。我很困惑我應該如何比較時間。 –

回答

3

假設日E用戶的日期/時間的格式如下所示:

$date  = '2012-11-22'; 
$startTime = '01:00'; // note the extra '0' in front 
$endTime = '04:00'; 

$userStartTime = "$date $startTime"; 
$userEndTime = "$date $endTime"; 

查找重疊做是這樣:

$overlaps = 0; 
foreach ($block as $block) { 
    if ($userStartTime < $block['end_datetime'] && $userEndTime > $block['start_datetime']) { 
     ++$overlaps; 
    } 
} 

// if $overlaps > 0 -> there's a booking in the way 

這基本上是採取非重疊條件是這樣的:

$userEndTime <= $block['start_datetime'] || $userStartTime >= $block['end_datetime'] 

並簡單地交換條件。

這可以很容易地寫入SQL,以減少數據庫和應用程序之間的網絡開銷。

+0

然後我不介意去用mysql的方式,我想我會爲它打開另一個問題。謝謝你傑克順便說一句:) –

+0

它會是一個問題,如果我在時間前沒有零? –

+0

@IbrahimAzharArmar也許MySQL在處理'DATETIME'時可以處理缺失的零,但是當你比較日期爲字符串時,就像在我的答案中一樣,你需要所有日期/時間格式相同。 –

1

由於現有的陣列來自一個SQL查詢:

$date  = '2012-11-22'; 
$startTime = '1:00'; 
$endTime = '4:00'; 

if(strlen($startTime==4)){$startTime="0".$startTime;} 
if(strlen($endTime==4)){$endTime="0".$startTime;} 

$query="SELECT id FROM table WHERE start_datetime='$date $startTime:00' OR end_datetime='$date $endtimeTime:00'"; 

如果查詢返回的東西,返回id已將其預訂!

如果您想知道是否有任何數據庫信息與兩個日期時間匹配,請將OR替換爲AND

如果你想知道,如果用戶時間段是任何數據庫的條目之間:

$query="SELECT id FROM table WHERE (start_datetime>='$date $startTime:00' AND start_datetime<='$date $endTime:00') OR (end_datetime<='$date $starttimeTime:00' AND end_datetime>='$date $endtimeTime:00') OR (start_datetime<='$date $startTime:00' AND end_datetime>='$date $starttimeTime:00')"; 
+0

仍然存在問題,如果選定的開始時間是1,endtime是5,並且在數據庫中我有2到4個存儲,它應該仍然在邏輯上返回true。 –

+0

是的,我編輯了最後一個查詢,它應該與該輸入一起工作。 – Naryl

1

檢查了這一點......根據你的需求來匹配現有的所有時間對其進行修改。 ..我只匹配一個你...

$date = '2012-11-22'; 
$startTime = '2:30'; 
$endTime = '4:00'; 

$existing[] = 
     array 
     (
      'id' => 1, 
      'start_datetime' => '2012-11-22 02:30:00', 
      'end_datetime' => '2012-11-22 05:00:00' 
     ); 

$UserStartTime = strtotime($date." ".$startTime); 
$UserEndTime = strtotime($date." ".$endTime); 

$ExistingStartTime = strtotime($existing[0]['start_datetime']); 
$ExistingEndTime = strtotime($existing[0]['end_datetime']); 

if($UserStartTime >= $ExistingStartTime && $UserEndTime <= $ExistingEndTime) 
{ 
    echo "BOOKED"; 
} 
else 
{ 
    echo "NOT BOOKED"; 
} 
0

這可能會幫助你

$date = '2012-11-22'; 
$startTime= '1:00:00'; // padded two zero 
$endTime = '4:00:00'; // padded two zero 

$start_datetime = $date. " ".(strlen(intval(substr($startTime,0,2))) > 1 ? $startTime : "0".$startTime); 

$end_datetime = $date. " ".(strlen(intval(substr($endTime,0,2))) > 1? $endTime : "0".$endTime); 
for($i = 0;$i<count($your_array);$i++) 
{ 
    if($your_array[$i]['start_datetime'] == $start_datetime) 
    { 
     // Start date Found 
    } 
    if($your_array[$i]['end_datetime'] == $end_datetime) 
    { 
     // Start end Found 
    } 
}