Первый вопрос. Будьте осторожны.
Я работаю над программным обеспечением, которое отслеживает время техников, потраченное на выполнение задач. Программное обеспечение должно быть расширено, чтобы распознавать различные множители коэффициентов оплаты в зависимости от дня недели и времени суток. (Например, "Время и полтора после пяти вечера в будние дни".)
Технология, использующая программное обеспечение, требуется только для регистрации даты, времени начала и времени остановки (в часах и минутах). Предполагается, что программное обеспечение будет прерывать ввод времени в части на границах, когда изменяются коэффициенты умножения. Единовременная запись не разрешается охватывать несколько дней.
Вот частичная выборка таблицы тарифов. Очевидно, ключи массива первого уровня - это дни недели. Ключи массива второго уровня представляют собой время дня, когда новый множитель запускается и запускается до следующей последовательной записи в массиве. Значения массива являются множителем для этого временного диапазона.
[rateTable] => Array
(
[Monday] => Array
(
[00:00:00] => 1.5
[08:00:00] => 1
[17:00:00] => 1.5
[23:59:59] => 1
)
[Tuesday] => Array
(
[00:00:00] => 1.5
[08:00:00] => 1
[17:00:00] => 1.5
[23:59:59] => 1
)
...
)
На простом английском языке это составляет полтора часа от полуночи до 8 утра, регулярный курс с 8 до 5 вечера, а также время от времени с 5 до 23:59. Время, в течение которого происходят эти разрывы, может быть произвольным ко второму, и для каждого дня может быть произвольное число из них. (Этот формат полностью подлежит обсуждению, но моя цель - сделать его максимально понятным для человека.)
В качестве примера: временная запись, зарегистрированная в понедельник с 15:00:00 (с 15:00 до 21:00:00 (9 часов)), будет состоять из 2 часов, выставленных на счет 1x и 4 часа с оплатой в 1,5 раза. Также возможно, чтобы однократная запись включала несколько разрывов. Используя пример rateTable выше, запись времени с 6:00 до 21:00 будет иметь 3 поддиапазона от 6-8 AM @1.5x, 8 AM-5PM @1x и 5-9 PM @1.5x. Напротив, также возможно, что запись времени может быть только с 08:15:00 до 08:30:00 и полностью охвачена в диапазоне одного множителя.
Я мог бы использовать некоторую помощь для кодирования некоторого PHP (или, по крайней мере, для разработки алгоритма), который может занять день недели, время начала и время остановки и разделить на необходимые подчасти. Было бы идеальным, чтобы выход был массивом, который состоит из нескольких записей для триплета (start, stop, multiplier). В приведенном выше примере выход будет выглядеть следующим образом:
[output] => Array
(
[0] => Array
(
[start] => 15:00:00
[stop] => 17:00:00
[multiplier] => 1
)
[1] => Array
(
[start] => 17:00:00
[stop] => 21:00:00
[multiplier] => 1.5
)
)
Я просто не могу обернуть голову вокруг логики разделения одного (старт, стоп) на (потенциально) несколько подчастей.