在两个小时内溢出阵列

时间:2019-05-10 09:23:16

标签: php datetime

我正在工作一个空闲日期时隙。我一直坚持创建适当的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
        )

..等等...

2 个答案:

答案 0 :(得分:0)

您可以这样处理

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']))
        ];
 }
}

Live Demo

答案 1 :(得分:0)

我建议使用\ 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

进行尝试