PHP - найти следующий доступный временной интервал

Мне нужна помощь в написании сценария для поиска следующего доступного временного интервала.

Пример: человек А хочет записаться на прием, и доступные временные интервалы каждый день: 9:00, 12:00, 16:00, 18:00, 21:00.

Итак, мне нужно проверить существующие данные и сравнить временные интервалы, забронированные для других встреч, а затем найти следующие доступные.

$apts = array(
        'Person 1' => '1/1/09-9:00',
        'Person 2' => '1/1/09-12:00',
        'Person 3' => '1/1/09-18:00',
        'Person 4' => '1/1/09-21:00'
        );

Итак, мне нужно найти следующий временной интервал для человека А против $apts, и он должен появиться в 16:00 (01.01.09-16:00). Затем появляется человек Б, и следующий временной интервал для него/нее должен быть «02.01.09-9:00», поскольку на 01.01.09 больше нет временных интервалов, поэтому идите в 9:00 следующего дня.

Сделать так как? Спасибо!!


person Shawn    schedule 05.11.2009    source источник
comment
Как вы указываете возможные временные интервалы (например, с учетом праздников и т. д.)? у вас есть другой массив с этой информацией, или вы планируете просто закодировать его?   -  person jheddings    schedule 05.11.2009
comment
Просто закодируйте это. Не принимая во внимание какие-либо особые случаи или что-то еще.   -  person Shawn    schedule 05.11.2009
comment
Звучит как проблема, легко решаемая базой данных.   -  person Myles    schedule 05.11.2009
comment
$apts — это огромный массив, содержащий все возможные встречи на год, или он генерируется из БД на каждый день?   -  person Alex Mcp    schedule 05.11.2009


Ответы (1)


База данных была бы лучшим решением с семантической точки зрения. Если вы хотите использовать одну таблицу со столбцами time и person_id, где time закодировано как время UNIX (хотя легко адаптируется к другим форматам), вы можете просто запустить:

SELECT time FROM table WHERE person_id = 0 AND time > 1234567890 LIMIT 1;

Придерживаясь вашего исходного решения только для PHP, семантически разумным решением может быть просто запуск цикла while для поиска следующего доступного временного интервала.

$timeslot = $desired_timeslot;
while(in_array($timeslot, $apts)) {
    $timeslot = get_next_timeslot($timeslot);
}
return $timeslot;

Конечно, вам придется определить функцию get_next_timeslot() в соответствии с вашим методом кодирования/организации.

person Steven    schedule 05.11.2009
comment
не используйте временные метки unix в своей базе данных, это затрудняет выполнение обычных запросов. если вы когда-нибудь захотите выбрать правильную дату и время в качестве временной метки unix, используйте UNIX_TIMESTAMP (столбец) - person Kris; 06.11.2009