Я работаю над добавлением опции просмотра дня в существующее календарное решение. Как и многие люди, внедряющие свои собственные календари, я пытаюсь смоделировать Google Календари. У них есть отличное календарное решение, а их дневной обзор обеспечивает большую гибкость. По большей части реализация идет хорошо; однако у меня возникают проблемы, когда речь идет о конфликтующих событиях.
По сути, я хочу, чтобы события занимали одно и то же пространство рядом. События, начинающиеся одновременно, должны иметь самое длинное событие. В примере набора данных, с которым я работаю, у меня есть четыре события:
A: 10:30 - 11: 30
B: 13:30 - 14: 30
C: 10:30 - 11:00
Д: 10:45 - 14: 00
Я могу справиться с A, C и D очень хорошо, проблема возникает с D. A должен быть оставлен от C, который должен быть оставлен от D; каждый берет одну треть ширины (это фиксированная ширина, поэтому я могу сделать простую математику, чтобы понять это). Проблема в том, что B должен находиться под A и C, слева от D. В идеале, B будет занимать столько же места, что и A и C (две трети ширины), но я бы даже согласился, что он занимает только одна треть ширины.
Мой массив событий выглядит примерно так:
$events = array(
'1030' => array(
'uniqueID1' => array(
'start_time' => '1030',
'end_time' => '1130',
),
'uniqueID2' => array(
'start_time' => '1030',
'end_time' => '1100',
),
),
'1045' => array(
'uniqueID3' => array(
'start_time' => '1045',
'end_time' => '1400',
),
),
'1330' => array(
'uniqueID3' => array(
'start_time' => '1330',
'end_time' => '1430',
),
),
);
Мой план состоит в том, чтобы добавить к каждому событию несколько индексов, которые включают количество событий, с которыми оно конфликтует (чтобы я мог рассчитать ширину) и какую позицию в этом ряду он должен иметь (чтобы я мог вычислить левое значение). Тем не менее, это не поможет B.
Я думаю, мне может понадобиться алгоритм, который использует базовую геометрию и матрицы, но я не уверен, с чего начать.
Любая помощь очень ценится.