首页 > 解决方案 > 在两个小时的插槽中溢出数组

问题描述

我正在研究一个免费的约会时间段。我坚持创建正确的 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
        )

.. 很快 ...

标签: phpdatetime

解决方案


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


推荐阅读