Php foreach循环在时隙间隔内,如果间隔是空闲的,则只返回四分之一时间

Php foreach循环在时隙间隔内,如果间隔是空闲的,则只返回四分之一时间,php,mysql,laravel,eloquent,Php,Mysql,Laravel,Eloquent,我有一个mySQL表“timeslots”,其中包含“interval”和“reserved”列。我如何循环遍历它并仅返回15分钟的间隔,但“剪切”15分钟的间隔必须保留=0。例如,我应该循环一列“interval”并返回08:15:00,但跳过08:00:00,因为08:08:00 interval是保留的(列保留=1),我还应该跳过interval 08:45:00,因为08:53:00是保留=1。我已经附上了这个问题的表格图像 几天来,我一直在努力寻找解决办法,但没有成功 您首先需要获得

我有一个mySQL表“timeslots”,其中包含“interval”和“reserved”列。我如何循环遍历它并仅返回15分钟的间隔,但“剪切”15分钟的间隔必须保留=0。例如,我应该循环一列“interval”并返回08:15:00,但跳过08:00:00,因为08:08:00 interval是保留的(列保留=1),我还应该跳过interval 08:45:00,因为08:53:00是保留=1。我已经附上了这个问题的表格图像

几天来,我一直在努力寻找解决办法,但没有成功


您首先需要获得保留的插槽。然后在循环中检查插槽是否有下一个保留插槽

public function getTimeSlots($app)
{
$reservedSlots = Timeslot::where('app', '=', $app)->where('reserved', '=', 1)->orderBy('intervals', 'ASC')->get();
$timeslots = Timeslot::where('app', '=', $app)->where('reserved', '=', 0)->orderBy('intervals', 'ASC')->get();
    $timeslotlist = array();

    foreach ($timeslots as $timeSlot) {
        $haveNextReservedSlot = array_filter($reservedSlots, function($v) use($timeSlot){ 
             $start_date = new DateTime($timeSlot['date'].' '.$timeSlot['intervals']);
             $since_start = $start_date->diff(new DateTime($v['date'].' '.$v['intervals']));
             return $since_start->i < 15; //if difference less than 15 min
      });
        if($haveNextReservedSlot) continue;

        $timeslotlist[] = array(
            'id' => $timeSlot['id'],
            'app' => $timeSlot['app'],
            'intervals' => $timeSlot['intervals'],
            'reserved' => $timeSlot['reserved'],
        );
    }
   return json_encode($timeslotlist);
}


公共函数getTimeSlots($app) { $reservedSlots=Timeslot::where('app','=','app)->where('reserved','=',1)->orderBy('interval','ASC')->get(); $timeslots=timeslots::where('app','=','app)->where('reserved','=',0)->orderBy('interval','ASC')->get(); $timeslotlist=array(); foreach($timeSlot作为$timeSlot){ $haveNextReservedSlot=array_filter($reservedslot,function($v)use($timeSlot){ $start_date=new DateTime($timeSlot['date'..'...$timeSlot['interval']); $since_start=$start_date->diff(新日期时间($v['date'..'..$v['interval']); 返回$since_start->i<15;//如果差异小于15分钟 }); 如果($haveNextReservedSlot)继续; $timeslotlist[]=数组( 'id'=>$timeSlot['id'], 'app'=>$timeSlot['app'], “间隔”=>$timeSlot[“间隔”], “保留”=>$timeSlot[“保留”], ); } 返回json_encode($timeslotlist); }
我想将集合转换为数组,这样比较上一个时隙和下一个时隙会更容易,例如

public function getTimeSlots($app)
{
    $timeslots = Timeslot::where('app', '=', $app)->orderBy('intervals', 'ASC')->get()->toArray();
    $timeslotlist = array();

    for($i=0;$i<count($timeslots);$i++){
        $current_slot=strtotime($timeslots[$i]->date." ".$timeslots[$i]->intervals);
        if(date('i',$current_slot) % 15===0){
            if((isset($timeslots[$i-1]) && $timeslots[$i-1]->reserved) or
                (isset($timeslots[$i+1]) && $timeslots[$i+1]->reserved)){
            }
            else{
                $timeslotlist[]=$timeslots[$i];
            }
        }

    }
    return json_encode($timeslotlist);
}
公共函数getTimeSlots($app) { $timeslots=Timeslot::where('app','=','app)->orderBy('interval','ASC')->get()->toArray(); $timeslotlist=array(); 对于($i=0;$idate.““$timeslots[$i]->间隔); 如果(日期('i',$current_slot)%15==0){ 如果((isset($timeslots[$i-1])&&$timeslots[$i-1]->保留)或 (isset($timeslots[$i+1])&&&$timeslots[$i+1]->保留){ } 否则{ $timeslotlist[]=$timeslots[$i]; } } } 返回json_encode($timeslotlist); } 这将在08:30返回。这就是您想要的吗?

请回答您的问题,并包含您尝试过但未按预期工作的代码。
public function getTimeSlots($app)
{
    $timeslots = Timeslot::where('app', '=', $app)->orderBy('intervals', 'ASC')->get()->toArray();
    $timeslotlist = array();

    for($i=0;$i<count($timeslots);$i++){
        $current_slot=strtotime($timeslots[$i]->date." ".$timeslots[$i]->intervals);
        if(date('i',$current_slot) % 15===0){
            if((isset($timeslots[$i-1]) && $timeslots[$i-1]->reserved) or
                (isset($timeslots[$i+1]) && $timeslots[$i+1]->reserved)){
            }
            else{
                $timeslotlist[]=$timeslots[$i];
            }
        }

    }
    return json_encode($timeslotlist);
}