为了账号安全,请及时绑定邮箱和手机立即绑定

Php foreach 在时隙间隔中循环,如果 between 空闲,则仅返回四分之一时间

Php foreach 在时隙间隔中循环,如果 between 空闲,则仅返回四分之一时间

PHP
FFIVE 2022-07-09 10:12:21
我有一个 mySQL 表'timeslots',其中包含“intervals”和“reserved”列。我如何循环遍历它并仅返回 15 分钟的间隔,但必须保留“剪切”15 分钟的间隔 = 0。例如,我应该遍历“间隔”列并返回 08:15:00 但跳过08:00:00 因为 08:08:00 间隔被保留(列保留 = 1),我也应该跳过间隔 08:45:00 因为 08:53:00 被保留 = 1。我附上了表格的图像对于这个问题。几天来,我一直试图为此找到解决方案,但没有成功。public function getTimeSlots($app){$timeslots = Timeslot::where('app', '=', $app)->where('reserved', '=', 0)->orderBy('intervals', 'ASC')->get();    $timeslotlist = array();    foreach ($timeslots as $timeSlot) {        $timeslotlist[] = array(            'id' => $timeSlot['id'],            'app' => $timeSlot['app'],            'intervals' => $timeSlot['intervals'],            'reserved' => $timeSlot['reserved'],        );    }   return json_encode($timeslotlist);}
查看完整描述

2 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

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


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);

}


查看完整回答
反对 回复 2022-07-09
?
萧十郎

TA贡献1815条经验 获得超13个赞

我想将集合转换为数组,然后比较上一个时隙和下一个时隙会更容易,例如


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);

}

这将返回 08:30。这是你想要的吗?


查看完整回答
反对 回复 2022-07-09
  • 2 回答
  • 0 关注
  • 159 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信