我需要一种方法来检查是否存在彼此重叠的事件。所以我制作了一个数组,其中包含每个事件的开始和结束时间。它看起来像这样:
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 :(得分: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;
}
答案 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
}
}