在PHP中区分两个多维数组

时间:2016-12-06 11:57:40

标签: php multidimensional-array diff scheduling

我必须为调度软件制作一些代码,以显示教师是否可用。

所以我做了以下(月)期:

    $begin = new \DateTime('first day of this month');
    $end = new \DateTime('last day of this month');

    $dailyInterval = new \DateInterval('P1D');
    $dailyPeriod = new \DatePeriod($begin, $dailyInterval, $end);
    $data = [];

    /** @var \DateTime $date */
    foreach($dailyPeriod as $date)
    {
        $currentDate = $date->format('Y-m-d');
        $start = new \DateTime("$currentDate 08:00");
        $finish = new \DateTime("$currentDate 20:00");

        $appointmentInterval = new \DateInterval($appointmentVariant->getInterval());
        $appointmentPeriod = new \DatePeriod($start, $appointmentInterval, $finish);

        /** @var \DateTime $duration */
        foreach($appointmentPeriod as $duration)
        {
            $endDate = clone $duration;
            $data['availability'][$currentDate][] = [
                'start' => $duration->format('H:i:s'),
                'end' => $endDate->modify('+90 minutes')->format('H:i:s')
            ];
        }
    }

输出如下:

availability: [
    '2016-12-01': [
        0: ['start': '08:00:00', 'end': '09:30:00'],
        1: ['start': '09:30:00', 'end': '11:00:00'],
        2: ['start': '11:00:00', 'end': '12:30:00'],
        3: ['start': '12:30:00', 'end': '14:00:00'],
        4: ['start': '14:00:00', 'end': '15:30:00'],
        5: ['start': '15:30:00', 'end': '17:00:00'],
        6: ['start': '17:00:00', 'end': '18:30:00'],
        7: ['start': '18:30:00', 'end': '20:00:00']
    ]
]

但是现在我们必须在教师不可用时离开数据库(这可能来自多个来源,约会,假期,重复事件等),所以最后我们将数组作为上面的数组,但是不可用:< / p>

unavailability: [
    '2016-12-01': [
        0: ['start': '14:30:00', 'end': '16:30:00'],
        1: ['start': '18:00:00', 'end': '18:20:00'],
    ]
]

现在问题是,当教师可用时,如何区分这两个数组以获得最终结果?很难循环可用的日期和时间,然后是不可用的日期和时间。

差异应该给我以下结果(DEL =删除):

availability: [
    '2016-12-01': [
        0: ['start': '08:00:00', 'end': '09:30:00'],
        1: ['start': '09:30:00', 'end': '11:00:00'],
        2: ['start': '11:00:00', 'end': '12:30:00'],
        3: ['start': '12:30:00', 'end': '14:00:00'],
        DEL 4: ['start': '14:00:00', 'end': '15:30:00'],
        DEL 5: ['start': '15:30:00', 'end': '17:00:00'],
        DEL 6: ['start': '17:00:00', 'end': '18:30:00'],
        7: ['start': '18:30:00', 'end': '20:00:00']
    ]
]

有人知道最有效的方法吗?

2 个答案:

答案 0 :(得分:0)

尝试将这一天分成10分钟。然后,您可以根据数据库中的不可用性取消设置。

然后,您可以使用当天的最小/最大值输出开始和结束。

希望这有帮助。

答案 1 :(得分:0)

$unavailability = your unavailability array();
$availability   = your availability array();
//this loop will procedd how much your availability in your ex : will be 1
foreach($availability as $key=>$val)
{
    if(isset($unavailability[$key]))
    {
       //6 times loop
       foreach($val as $new_key => $new_val)
       {
            2 times loop
            foreach($unavailability[$key] as $unavailkey => $unavail_val)
            {
                if($new_val['start'] >= $unavail_val['start'])
                {
                   unset($new_val)
                }
                else
                {
                   continue;
                }
            }
       }
    }
    else
    {
       continue;
    } 

}
如果您的设计结果数据过于复杂,那么它非常棘手,可能会让您遇到性能问题。

它也可以使用assosiative数组完成,但代码会变脏

祝你好运