2016-04-18 68 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 
    } 
    } 
相关问题