2016-04-18 7 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; 

しかし、私は開始日と終了日をチェックしておりますので、これは常にtrue与えます私の配列内の同じ項目の。

私は、現在の配列項目の開始値を比較する方法に必要な、これがさらに可能であれば、以前の配列項目の終了値は

誰もが知っていますか?

事前に感謝します。

+0

'エンドフイ。 – 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でループスタートし、開始時間を比較します現在のイベントのうち、index-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のループのために、このコードを試してください:あなたは、 `{`とif` `の本体を起動して、それを終了することはできません

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 
    } 
    } 
関連する問題