2016-04-18 70 views
0

我需要一種方法來檢查是否有相互重疊的事件。所以我在每個事件的開始和結束時間都進行了排列。它看起來像這樣:PHP檢查變量是否小於數組中的前一項

Array 
(
    [0] => Array 
     (
      [start] => 0930 
      [end] => 1200 
     ) 

    [1] => Array 
     (
      [start] => 1000 
      [end] => 1230 
     ) 

    [2] => Array 
     (
      [start] => 1300 
      [end] => 1530 
     ) 

) 

這是我一直在努力,檢查是否有重疊事件:

if ($orders->have_posts()): 
     while ($orders->have_posts()) : $orders->the_post(); 
      foreach($order as $o){ 
      $start = $o['start']; 
      $end = $o['end']; 
      $attractieID = $o['attractie']->ID; 

      foreach($order as $key => $attractieID){ 
       $slots[] = array('start' => $start, 'end' => $end); 
       if($start < $end){ 
        //overlap 
       }else{ 
        //no overlap 
       } 
      } 
      } 
     endwhile; 
endif; 

但由於我檢查開始和結束日期,這將永遠給真在我的數組中相同的項目。

我需要的方式來比較當前數組項的起始值和前一陣項目

任何人都知道,如果這甚至有可能的終值?

非常感謝提前!

+0

你不能用''{開始if'的'身體,結束於' endif'。 – Barmar

+0

@Barmar這只是一個錯字複製我的代碼 –

+0

@FrankLucas - 關於複製代碼是,它不會產生拼寫錯誤。給實際的代碼。 –

回答

0

只需使用正常的for循環即可。而且,可以肯定的一切是正確的,檢查它之前對數組進行排序(如果你確信這是戈納進行排序,你可以跳過這一部分)

$sortedOrders = usort($order, function($a, $b) 
{ 
    $aStart = $a['start']; 
    $bStart = $b['start']; 

    return ($a < $b) ? -1 : 1; 
}); 

$count = count($sortedOrders); 
for($i = 1; $i < $count; $i++) 
{ 
    if($sortedOrders[$i - 1]['end'] > $sortedOrders[$i]['start']) 
    { 
     // Handle overlap 
    } 
} 
1

開始循環在索引1,和比較的開始時間當前事件的索引爲1的事件結束。

$count = count($order); 
for ($i = 1; $i < $count; $i++) { 
    if ($order[$i]['start'] < $order[$i-1]['end']) { 
     // overlap 
    } else { 
     // no overlap 
    } 
} 

如果要做到這一點,同時還從$order複製到slots,你可以使用一個變量,從先前的迭代按住結束時間。

$prevEnd = null; 
    foreach($order as $o){ 
    $start = $o['start']; 
    $end = $o['end']; 
    $attractieID = $o['attractie']->ID; 

    $slots[] = array('start' => $start, 'end' => $end); 
    if($prevEnd !== null && $start < $prevEnd){ 
     //overlap 
    }else{ 
     //no overlap 
    } 
    $prevEnd = $end; 
    } 

DEMO

+0

我的槽陣列應該在這段代碼中的位置? –

+0

這與檢查重疊有什麼關係? – Barmar

+0

因爲我的開始和結束值存儲在我的插槽數組中 –

0

試試這個代碼,以用於循環,而不是的foreach:

for($i=0;$i<count($order);i++){ 
    $slots[] = array('start' => $start, 'end' => $end); 
    if($order[$i+1]){ 
    if($order[$i]['start'] < $order[$i+1]['end']{ 
     //overklap 
    }else{ 
     //no overlap 
    } 
    } 
相關問題