Я должен сделать некоторый кусок кода для планирования программного обеспечения, который показывает, доступен ли инструктор или нет.
Итак, я сделал следующий (месячный) период:
$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']
]
]
Кто-нибудь знает наиболее эффективный способ сделать это?
Попробуйте разделить день на 10-минутные блоки. Затем вы можете сбросить их в зависимости от недоступности из базы данных.
Затем вы можете вывести начало и конец, используя минимальные / максимальные значения для этого дня.
Надеюсь это поможет.
$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;
}
}
это довольно сложно и может заставить вас столкнуться с проблемой производительности, если ваши данные результата проектирования слишком сложны.
Это может быть сделано с использованием ассоциативного массива, но код станет грязным
удачи