Ohne den Code anzuschauen, fallen mir hier schon einige Probleme auf:
Ich würde dir vorschlagen, erst mal einen Prototypen mittels statischem HTML zu entwickeln, um zu schauen, wie man so etwas darstellen kann. Gleich mit php anzufangen, obwohl man gar nicht weißt, wie was auszusehen hat, ist schon mal der falsche Schritt.
Mache dich mit MVC vertraut, und wie man so was kapseln kann. Kein Mensch tut sich so ein Code freiwillig an.
Du unterschätzt diese Problemstellung gewaltig. Nur mit Tabellen kommt du hier nicht weit. Was ist, wenn du ein Termin um 08:05 Uhr hast? Dies würde sich mit deiner Tabelle nicht darstellbar sein. Du brauchst also etwas, womit du die Termine beliebig verschieben kannst.
Um vielleicht mal ein Denkanstoß zu geben, wie so was aussehen könnte:
(Der Code ist nicht optimal!)
Um die Breite und Position jeder Division herauszufinden, würde ich vielleicht so vorgehen (ausgehend von meinem Beispiel):
1. Alle Termine aufsteigend sortieren.
2. Alle Termine, die sich nicht überschneiden in ein neues Array speichern, und sie aus dem Haupt-Array löschen.
3. Schritt 2 so lange wiederholen, bis das Haupt-Array leer ist. Dann hätten wir folgende Arrays:
Array[0] = Termin1, Termin3, Termin5
Array[1] = Termin2, Termin4, Termin6
Array[2] = Termin7
4. Die Positionen für Termin1, Termin3 und Termin5 wissen wir dann schon mal. Nur die Breite wissen wir noch nicht, weil wir nicht wissen, wie viele Überschneidungen diese Termine haben. Wir wissen nur, dass es maximal 2 Überschneidungen geben kann. Also nehmen wir uns nun Termin1 und überprüfen nun diesen Termin mit allen anderen Termin aus Array[1] und Array[2] nach Überschneidungen.
Es gibt eine Überschneidung: Termin2 überschneidet sich mit Termin1. Also hat Termin1 die Breite von Gesamtbreite / (Anzahl Überschneidungen + 1). Also können wir nun Termin1 in die Tabelle zeichnen.
5. Dasselbe machen wir mit Termin3 und Termin5.
6. Nun wird es etwas Tricky. Jetzt schauen wir uns Array[1] an. Wir wissen weder den linken Versatz, noch die Breite.
Um den linken Versatz zu ermitteln, müssen wir wissen, wieviele Überschneidungen es vorher gab. Also nehmen wir uns Termin2 und überprüfen es mit allen Terminen aus Array[0].
Zusätzlich schauen wir uns die Breite an. Also überprüfen wir Termin2 mit allen Terminen aus Array[2]. Wir wissen also, dass es ein Termin gibt, welches schon vorher eingetragen wurde, und ob welche noch eingetragen werden müssen. Also ist die Breite Gesamtbreite / (Anzahl Überschneidungen + 1)) und der linke Versatz Anzahl vorherige Termine * Breite.
7. Dasselbe machen wir mit Termin4 und Termin6.
8. Schritt 6 mit Array[2] wiederholen.
Schritt 4 ließe sich auch mit Schritt 5 verallgemeinern.
Ob jetzt mein Ansatz richtig ist, oder ob es einfachere Wege gibt, weiß ich jetzt auch nicht. Das habe ich mir von ein paar Minuten zusammengesponnen ^^