【问题标题】:PHP check if variable is smaller than previous item in arrayPHP检查变量是否小于数组中的前一项
【发布时间】:2016-04-18 14:54:54
【问题描述】:

我需要一种方法来检查是否存在相互重叠的事件。所以我用每个事件的开始和结束时间做了一个数组。它看起来像这样:

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;

但这总是正确的,因为我正在检查数组中同一项目的开始和结束日期。

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

有人知道这是否可能吗?

非常感谢!

【问题讨论】:

  • 您不能以{ 开头if 的正文并以endif 结尾。
  • @Barmar 这只是复制我的代码的错字
  • @FrankLucas - 关于复制代码的事情是,它不会产生拼写错误。给出实际代码。
  • @Pamblam 我的循环中有很多其他内容与我为什么要复制它的问题无关?
  • 复制 + 删除也不会产生错别字.... 复制 + 重写不仅会产生错别字,而且如果你们中的一个“错别字”掩盖了问题,人们将难以回答.不要仅仅为了 SO 重写你的代码 :)

标签: php arrays loops


【解决方案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

【讨论】:

  • 这与检查重叠有什么关系?
  • 因为我的开始和结束值都存储在我的槽数组中
  • 不是存储在$order数组中吗?
  • 是的,但我需要根据吸引力 id 进行检查,请参阅 OP 中的 $attractieID = $o['attractie']-&gt;ID;
  • 在一个订单中,您可以有多个事件(景点),每个景点都有一个开始和结束值。如果有重叠的事件(吸引力),我需要检查每个事件(吸引力)
【解决方案2】:

试试这个代码,用 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
     }
   }

【讨论】:

    【解决方案3】:

    只需使用普通的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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多