【发布时间】:2016-12-06 11:57:39
【问题描述】:
我必须为调度软件编写一些代码,以显示讲师是否有空。
所以我做了以下(月)期间:
$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']
]
]
但是现在我们必须在讲师不可用时从数据库中取出(这可能来自多个来源,约会,假期,重复事件等),所以最后我们有了上面的数组,但是不可用:
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']
]
]
有人知道最有效的方法吗?
【问题讨论】:
标签: php multidimensional-array diff scheduling