не понимаю зачем такие сложности, если теоретически можно заставить grid делать всё самостоятельно
понятно, этот пример ещё нужно доработать напильником, но основная мысль, думаю, ясна
если хочется страдать вручную, тогда крайне примерно алгоритм вижу так:
1) делаем ассоциативный массив, который будет содержать время => [ количество-блоков, есть-переходящие, ]
2) проходимся по всем блокам и заполняем массив, в том числе переходящими значениями, т.е. если блок с 10:00 до 11:30, а деление по полчаса, то прибавляем 1 к количество-блоков
для 10:00, 10:30 и 11:00, а для 10:30 и 11:00 дополнительно ставим флаг есть-переходящие
, возможно дополняя ссылками на данные блока для удобства дальнейшей работы
3) сортируем массив по ключам
4) (наверное самый сложный шаг) проходимся по массиву и берём максимальное значение количество-блоков
в сериях !есть-переходящие
, есть-переходящие
... (т.е. это максимальное значение присваиваем всей серии)
5) окончательно проходимся по массиву и рисуем блоки опираясь на количество-блоков