PHP检查变量是否小于数组

时间:2016-04-18 14:54:54

标签: php arrays loops

我需要一种方法来检查是否存在彼此重叠的事件。所以我制作了一个数组,其中包含每个事件的开始和结束时间。它看起来像这样:

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;

但是,由于我正在检查数组中相同项目的开始和结束日期,因此这将始终为真。

我需要比较当前数组项的起始值和前一个数组项的结束值

任何人都知道这是否可能?

非常感谢提前!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
    }
}

答案 2 :(得分:0)

尝试使用for循环代替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
     }
   }