在两个小时的插槽中溢出阵列



我正在处理免费日期时间插槽。我一直坚持创建适当的Spilts数组并显示可用的时间插槽。

我想从开始和结束时间溢出2小时的插槽。

    foreach ( $period as $dt ){
                $m = [
                    'start'=>date('Y-m-d ',strtotime($dt->format('Y-m-d').' -1 
                     day')).$max,
                    'end'=>$dt->format('Y-m-d ').$min
                ];
                foreach($free as $k=>$f){
                    if($m['start']>$f['start'] && $m['start']<=$f['end']){
                        $free[$k]['end'] = $m['start'];
                        if($m['end']<$f['end'])
                            $free[] = ['start'=>$m['end'], 'end'=>$f['end']];
                    }
                    elseif($m['end']<$f['end'] && $m['end']>$f['start']){
                        $free[$k]['start'] = $m['end'];
                    }
                }
            }

因此,例如,上面的会议时间阵列应产生以下空闲时间:

Array
(
    [0] => Array
        (
            [start] => 2019-05-08 07:00:00
            [end] => 2019-05-08 17:00:00
        )
    [1] => Array
        (
            [start] => 2019-05-09 11:25:00
            [end] => 2019-05-09 12:40:00
        )
    [2] => Array
        (
            [start] => 2019-05-09 14:15:00
            [end] => 2019-05-09 14:30:00
        )
    [3] => Array
        (
            [start] => 2019-05-10 07:00:00
            [end] => 2019-05-10 17:00:00
        )
    [4] => Array
        (
            [start] => 2019-05-09 07:00:00
            [end] => 2019-05-09 07:40:00
        )
    [5] => Array
        (
            [start] => 2019-05-11 07:00:00
            [end] => 2019-05-11 17:00:00
        )
)

预期输出:

  Array
  (
    [0] => Array
        (
            [0] => Array( 
                   [start] => 2019-05-08 07:00:00
                   [end] => 2019-05-08 09:00:00
             )
            [1] => Array( 
                   [start] => 2019-05-08 09:00:00
                   [end] => 2019-05-08 11:00:00
             )
            [2] => Array( 
                   [start] => 2019-05-08 11:00:00
                   [end] => 2019-05-08 13:00:00
             )
            [3] => Array( 
                   [start] => 2019-05-08 13:00:00
                   [end] => 2019-05-08 15:00:00
             )
            [4] => Array( 
                   [start] => 2019-05-08 15:00:00
                   [end] => 2019-05-08 17:00:00
             )
        )
    [1] => Array
        (
            [start] => 2019-05-09 11:25:00
            [end] => 2019-05-09 12:40:00
        )

..上...

您可以将其作为

接近
foreach($arr as $k => $v){
$diff = strtotime($v['end'])-strtotime($v['start']);
if($diff >= 7200){
    for($i=strtotime($v['start']);$i<strtotime($v['end']);){
        $start = date('Y-m-d H:i:s',$i);
        $i     = $i+7200;
        $end   =  date('Y-m-d H:i:s',$i);
        $res[$k][] = [
            'start' => $start,
            'end'   => $end
        ];
    }
 }else{
    $res[$k][] = [
            'start' => date('Y-m-d H:i:s',strtotime($v['start'])),
            'end'   => date('Y-m-d H:i:s',strtotime($v['end']))
        ];
 }
}

实时演示

我建议使用 datetime,使用

很舒适
<?php
$start = new DateTime('2019-05-08 07:00:00');
$end = new DateTime('2019-05-08 07:30:00');
function getSlots(DateTime $start, DateTime $end): array
{
    $slots = [];
    while ($start < $end) {
        $old = clone($start);
        $start->modify('+2 hours');
        if ($start > $end) {
            echo 1;
            $slots[] = [
                'from' => $old,
                'to' => $end
            ];
            return $slots;
        } else {
            $slots[] = [
                'from' => $old,
                'to' => clone($start)
            ];
        }
    }
    return $slots;
}
var_dump(getSlots($start, $end));

您可以在那里尝试https://3v4l.org/qaatj

最新更新