[PHP] dynamische Baumdarstellung mit HTML-Tables & PHP

S

sparky

Mitglied
Hallihallo,
um es kurz zu erklären, ich suche nach einem Algorithmus o.ä. mit dem ich dynamisch so Baumdarstellungen von Turnieren berechnen/anzeigen kann.
Ein Beispiel hier, das sollte die grobe Funktionsweise verdeutlichen und zeigen was ich als Ziel habe.
http://www.dotlan.net/gallery/archive/20040127-85ACE3/0004.png

Ich hab shcon unendlich viele Ansätze versucht, habs bisher aber noch nicht hinbekommen und deswegen frag ich einfach mal hier.

Die Teams liegen in mehreren Tabellen die ungefähr so aussehen könnten. Damit lässt sich der prinzipielle Turnierverlauf korrekt berechnen (also wer wo hinverteilt wird, ausgescheiden ist etc ...) Das Problem ist nur, dass in so eine Baumansicht mit HTML-Tabellen umzusetzen. Hab auch shcon versucht die einzelnen Schritte in nem extra Table für die Baumansicht noch zu speichern, aber das Problem liegt wie gehabt an der HTML Ausgabe.

teams:
| teamid | name | round | side | seeding_no |

matches:
| id | team1id | team2id | victoryid | loserid |

hat sowas schonma jemand gemacht, oder hat jemand ne Idee/Tipp, kompletten Neuansatz ? ... das Problem lässt mich einfach nicht los, aber ich werd noch verrückt :|
 
Boa, ich hab mir jetzt nur mal das Bild angesehen. Heftig. Aber leider kann ich dir da nicht helfen.
Nach Tabellen sieht das ja nicht aus - sonst wären die Boxen ja auch alle in einer Reihe..
Es könnte doch aber auch sein, dass die Boxen Bilder sind, die dann mittels PHP und der Grafiklibrary (don't ask me how!) beschriftet werden.
Evtl. ist vorher ja auch bekannt, wieviele Spiele es gibt? Dann kann man das schon auf einem Bild anordnen..

Vll. hilft dir das ja ein bisschen..
 
ohje :)) sowas hab ich bisher auch noch nicht gemacht.
aber mögliche ansätze wären:

  • Tabellen
  • Layer (Ebenen, Div's)
  • Ganzes Image mit PHP und GD erstellen
letzters ist natürlich nicht gerade leicht, aber flexibel. ich geh davon aus, das du diese ansicht nach jedem turnier aktualisieren willst, bis alle turniere durch sind, oder soll der verlauf erst nach ablauf aller turniere veröffentlicht werden?
 
nein, also es sind 100% Tabellen.
Ich habs mir schonmal aufgezeichnet, das geht wenn man doppelt so viele Reihen wie vorhandene Teams (in Runde 0) nimmt.

EDIT:
hier noch ein anderes Beispiel. Das ist 100% mit Tabellen gelöst:
http://www.kepler2004.de/bilder/treeview.jpg

also die <tr> sind dann Teamanzahl * 2, und dann quasi immer in die Lücken "gefüllt"
 
Zuletzt bearbeitet:
der einfachste weg wäre, die leute die bereits solch ein turnierverlauf erstellt haben, nach dem quelltext zu fragen :D

ich versuch mal was in der richtung hinzubekommen...

edit: ok, hier findest du mal meinen ansatz zu dem thema...
>> turnier.php
>> turnierquelle.php
vielleicht hilft es dir ja weiter :)
 
Zuletzt bearbeitet:
naja gut, soweit bin ich bisher auch immer gekommen :)
Das Problem kommt auf, sobald due die Verlierer aus der Gewinnerseite links dann wieder einordnen musst.

Das Problem ist dass keiner seinen Quelltext rausrückt ._. die sind z.T. sogar extra mit Zend Optimizer verschlüsselt ...
 
sparky schrieb:
Das Problem kommt auf, sobald due die Verlierer aus der Gewinnerseite links dann wieder einordnen musst.

nein warum? du brauchst doch nur (wenn die gewinner seite fertig ist mit allen spielen) auf die selbe art und weise gewinner und looser verarbeiten.

also (bsp. gewinner seite)... array() $zweite_runde anlegen und inhalt von array() $gewinner reinkopieren -> dann legst du unten wieder ein formular an, das alle spieler anzeigt und stellst anschliessend die gewinner ein -> formular abschicken und gewinner wieder ermitteln.

so kann man's erstmal machen :D vll ist prozedual aber hier auch der falsche ansatz und man sollte es lieber oo lösen :frage:
 
also ich bins mal wieder :)
Ich habs jetzt wohl mal soweit geschafft, einen normalen Baum richtig auszugeben. Allerdings hab ich für die linke Seite noch nix brauchbares basteln können. Eventuell kann sich ja hier mal jemand den Code anschaun und rumprobieren ? :)

PHP:
<?php
  function gameinfo($team_1 = "xXx", $team_2 = "xXx")
           {
           	$gameinfo .= "<table width=\"70\" height=\"50\" cellspacing=\"0\" border=\"1\">";
           	$gameinfo .= "  <tr><td align=\"center\">".$team_1."</td></tr>";
           	$gameinfo .= "  <tr><td align=\"center\">vs.</td></tr>";
           	$gameinfo .= "  <tr><td align=\"center\">".$team_2."</td></tr>";
           	$gameinfo .= "</table>";
           	return $gameinfo;
           }

  $teams = 16;
  $teams = $teams/2;
  $rounds = log($teams)/log(2);

  $y_max = $teams*2-1;
  $x_max = $rounds*2+1;

  echo "<table border=0 cellpadding=0 cellspacing=0><tr>\n";

  for($i=1;$i<=$x_max;$i++)

      {
      echo ($i%2) ? "<td width=70 align=center><b>round ".++$round."</b></td>" : "<td width=70>&nbsp;</td>";
      }

  echo "</tr></table><br>";

  for($x = 1; $x <= $x_max; $x++)
      {
      for($y = 1;$y <= $y_max; $y++)
          {
          # Runde 1
          if($x == 1 && $y%2) { $match[$x][$y] = gameinfo(); }

          # Runde 2
          if($x == 3 && $y%2 == false && ++$temp2%2)
             {
             $match[$x][$y] = gameinfo();;

             for($i=$y-1; $i <= $y+1; $i++) { $match[$x-1][$i] = "<img src=\"up.gif\">"; }

             $match[$x-1][$y-1] = "<img src=\"right_down.gif\">";
             $match[$x-1][$y] = "<img src=\"middle.gif\">";
             $match[$x-1][$y+1] = "<img src=\"right_up.gif\">";
             }

          # Runde 3
          if($x == 5 && $y%4 == false && ++$temp3%2)
             {
             $match[$x][$y] = gameinfo();;
             $match[$x-1][$y] = "<img src=\"middle.gif\">";

             for($i=$y-2; $i <= $y+2; $i++) { $match[$x-1][$i] = "<img src=\"up.gif\">"; }

             $match[$x-1][$y-2] = "<img src=\"right_down.gif\">";
             $match[$x-1][$y] = "<img src=\"middle.gif\">";
             $match[$x-1][$y+2] = "<img src=\"right_up.gif\">";
             }

          # Runde 4
          if($x == 7 && $y%8 == false && ++$temp4%2)
             {
             $match[$x][$y] = gameinfo();;
             $match[$x-1][$y] = "<img src=\"middle.gif\">";

             for($i=$y-4; $i <= $y+4; $i++) { $match[$x-1][$i] = "<img src=\"up.gif\">"; }

             $match[$x-1][$y-4] = "<img src=\"right_down.gif\">";
             $match[$x-1][$y] = "<img src=\"middle.gif\">";
             $match[$x-1][$y+4] = "<img src=\"right_up.gif\">";
             }

          # Runde 5
          if($x == 9 && $y%16 == false && ++$temp5%2)
             {
             $match[$x][$y] = gameinfo();;
             $match[$x-1][$y] = "<img src=\"middle.gif\">";

             for($i=$y-8; $i <= $y+8; $i++) { $match[$x-1][$i] = "<img src=\"up.gif\">"; }

             $match[$x-1][$y-8] = "<img src=\"right_down.gif\">";
             $match[$x-1][$y] = "<img src=\"middle.gif\">";
             $match[$x-1][$y+8] = "<img src=\"right_up.gif\">";
             }

          # Runde 6
          if($x == 11 && $y%32 == false && ++$temp6%2)
             {
             $match[$x][$y] = gameinfo();;
             $match[$x-1][$y] = "<img src=\"middle.gif\">";

             for($i=$y-16; $i <= $y+16; $i++) { $match[$x-1][$i] = "<img src=\"up.gif\">"; }

             $match[$x-1][$y-16] = "<img src=\"right_down.gif\">";
             $match[$x-1][$y] = "<img src=\"middle.gif\">";
             $match[$x-1][$y+16] = "<img src=\"right_up.gif\">";
             }

          # Runde 7
          if($x == 13 && $y%64 == false && ++$temp7%2)
             {
             $match[$x][$y] = gameinfo();;
             $match[$x-1][$y] = "<img src=\"middle.gif\">";

             for($i=$y-32; $i <= $y+32; $i++) { $match[$x-1][$i] = "<img src=\"up.gif\">"; }

             $match[$x-1][$y-32] = "<img src=\"right_down.gif\">";
             $match[$x-1][$y] = "<img src=\"middle.gif\">";
             $match[$x-1][$y+32] = "<img src=\"right_up.gif\">";
             }

          # Runde 8
          if($x == 15 && $y%128 == false && ++$temp8%2)
             {
             $match[$x][$y] = gameinfo();;
             $match[$x-1][$y] = "<img src=\"middle.gif\">";

             for($i=$y-64; $i <= $y+64; $i++) { $match[$x-1][$i] = "<img src=\"up.gif\">"; }

             $match[$x-1][$y-64] = "<img src=\"right_down.gif\">";
             $match[$x-1][$y] = "<img src=\"middle.gif\">";
             $match[$x-1][$y+64] = "<img src=\"right_up.gif\">";
             }

          # Runde 9
          if($x == 17 && $y%256 == false && ++$temp9%2)
             {
             $match[$x][$y] = gameinfo();;
             $match[$x-1][$y] = "<img src=\"middle.gif\">";

             for($i=$y-128; $i <= $y+128; $i++) { $match[$x-1][$i] = "<img src=\"up.gif\">"; }

             $match[$x-1][$y-128] = "<img src=\"right_down.gif\">";
             $match[$x-1][$y] = "<img src=\"middle.gif\">";
             $match[$x-1][$y+128] = "<img src=\"right_up.gif\">";
             }

          # Runde 10
          if($x == 19 && $y%512 == false && ++$temp10%2)
             {
             $match[$x][$y] = gameinfo();;
             $match[$x-1][$y] = "<img src=\"middle.gif\">";

             for($i=$y-256; $i <= $y+256; $i++) { $match[$x-1][$i] = "<img src=\"up.gif\">"; }

             $match[$x-1][$y-256] = "<img src=\"right_down.gif\">";
             $match[$x-1][$y] = "<img src=\"middle.gif\">";
             $match[$x-1][$y+256] = "<img src=\"right_up.gif\">";
             }

          # Runde 11
          if($x == 21 && $y%1024 == false && ++$temp11%2)
             {
             $match[$x][$y] = gameinfo();;
             $match[$x-1][$y] = "<img src=\"middle.gif\">";

             for($i=$y-512; $i <= $y+512; $i++) { $match[$x-1][$i] = "<img src=\"up.gif\">"; }

             $match[$x-1][$y-512] = "<img src=\"right_down.gif\">";
             $match[$x-1][$y] = "<img src=\"middle.gif\">";
             $match[$x-1][$y+512] = "<img src=\"right_up.gif\">";
             }
          }
      }

  // ausgabe
  echo "<table border=0 cellpadding=0 cellspacing=0>\n";
  for($y = 1;$y <= $y_max; $y++)
      {
      echo "<tr>";
      for($x = 1; $x <= $x_max; $x++)
          {
          if($match[$x][$y])
             {
             echo "  <td width=70 align=center>".$match[$x][$y]."</td>\n";
             }
          else
             {
             echo "  <td width=50>&nbsp;</td>\n";
             }
          }
      echo "</tr>\n";
      }
  echo "</table>\n";
?>
 
Zurück
Oben