我必须为调度软件制作一些代码,以显示教师是否可用。
所以我做了以下(月)期:
$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']
]
]
有人知道最有效的方法吗?
答案 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数组完成,但代码会变脏
祝你好运