mySQL Tabelle --> Gegliederte HTML Liste per PHP

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • mySQL Tabelle --> Gegliederte HTML Liste per PHP

      Hi,

      also mein Problem sieht wie folgt aus:
      Ich habe ein mySQL Tabelle in der verschiedene Kategorien eingetragen sind. Diese haben jeweils eine ID und einen Namen (z.B. Mensch), dann gibt es noch eine refID welche festhält, ob die Kategorie zu einer Oberkategorie gehört (z.B. Gesang - hat als refID die ID von Mensch).
      Diese Kategorien stehen in keiner eindeutigen Reihenfolge (können natürlich per mySQL nach refID gegroupt werden o.Ä.), sollen jedoch in eine solche Struktur gebracht werden:

      PHP-Quellcode

      1. <ul>
      2. <li>Mensch
      3. <ul>
      4. <li>Gesang</li>
      5. <li>Sprache</li>
      6. </ul>
      7. <li>Tier</li>
      8. </ul


      Ich find grad irgendwie keinen Ansatz. Schleife die über jede Tabellenzeile iteriert ist klar, allerdings weiß ich nicht weiter.
      (Es gibt natürlich auch evtl mehr Ebenen als zwei)

      Jemand ne Idee? (Oder sollte ich vllt die Tabelle erweitern - z.B. die "Stufe" der Kategorie hinzufügen)
    • Falls die Tiefe der Ebenen beliebig ist, benötigst du Rekursion. Ansonsten kannst du es über Schleifen lösen. Welche Sprache benutzt du zum auslesen und verarbeiten der mySQL ergebnisse und für die Html Ausgabe?

      Edit: Habe gerade im Thread Titel gelesen, dass du mit PHP arbeitest. Kann dir morgen helfen, falls noch Bedarf besteht.
    • Jo PHP...

      Über Rekursion hab ich auchschon nachgedacht, allerdings bereitet mir das seit eh und je ziemliche Kopfschmerzen. Naja ich werds grad nochmal probieren, falls ich nicht weiterkomm editier ich meine Probleme hier rein.

      Vielen Dank schonmal ;)

      EDIT: Ok nee keine Ahnung. Ich komm net drauf wie ich das machen soll... Fang ich mit der höchsten refID an und Bilde quasi die unterste Liste, guck von welcher Kategorie sie abhängt, schreib die drüber, guck von welcher die abhängt etcetc, dann hab ich aber auch nur einen Strang. kA wie ich die ganze andere Struktur drumrum bekommen soll.
      Mehrdimensionale Arrays, darin alles ordnen und dann imploden? Aber der müsste dann irgendwie auch n-dimensional sein? Ich steig grad kein bisschen durch. (Könnte auch dran liegen, dass mir etwas das Verständnis für das Zusammenspiel von PHP und mySQL bzw. die vorhandenen Befehle fehlen oderso, kA)

      EDIT2: Was man auchnoch machen könnte, wäre hinter jede <li>blabla</li> die ID der Kategorie zu schreiben und dann den String nach der ID durchsuchen und trennen um das Untermenu einzufügen. Allerdings klingt das irgendwie in der theorie schon sehr unsauber und es gibt bestimmt tollere Lösungen :S

      EDIT3: Achja, rekursive Denkweise... Also mal durchspielen:
      ID = 1, $temp = SELECT * FROM bla WHERE refID = 1, wenn $temp = NULL, dann </ul> und von Anfang an mit ID++, wenn nicht, dann neue <ul> aufmachen (was dann? die erste Zeile ist in $temp oder? - auch wenn die SQL Abfrage mehr Zeilen zurück gibt?) also <li>$temp->Name</li> zur Rückgabe hinzufügen, dann von Anfang an mit ID = $temp->ID... Oder? :) (Irgendwas hab ich vergessen oder?)
      Achja und ich glaube dazu müsste die Datenbank nach refID gegrouped vorliegen, was sich per Trigger wohl realisieren ließe, aber erstmal sehen was du so auf Lager hast ramius ;)

      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von ^woOt ()

    • Erstmal per se gilt: alles was rekursion kann, kann iteration nur schneller. Ich kenn mich nciht mit php und so aus, aber eigentlich ist iteration immer geiler, nur halt manchmal schwierig zu schreiben (aka rekursiv definierte datentypen, wie bäume oder ähnliches.). als ansatz für deine rekursion wäre wohl hilfreich du iterierst alle oberkatoegorien und rufst halt eine funktion auf, die alle unterkategoriern darstellt und von denen die unterkategorien. also es gibt eine darstellfunktion die halt solange in die tiefe geht bis eine kategorie keine unterkategorien hat. ( das ist so crap mit rekursion ich kanns einfach nciht erklären sondern mir nur vorstellen ;) ). also funktion listet alle unterkategorien auf, wobei für jede unterkategorie entsprechende funktion nochmal aufgerufen wird. abbruchbedingung halt, keine unterkategorien mehr da, die noch nciht aufgelistet wurden.

      ich hoffe ich konnte helfen, gute nacht euch noch ;)
      [17:57:06] <Cave_Man> wie mache ich buletten?
      [...]
      [17:58:35] <Warbringer> Der Höhlemensch auf kulinarischer Entdeckungsreise: "Wie mache ich Bouletten?"
    • Jaja genau, das mit dem entweder hat Unterkategorien oder hat keine, hab ich in meinem 3ten Edit ja gemeint... Naja aber irgendwie macht das in meinem Kopf immernoch ziemlich Probleme bei einer unsortierten Tabelle, wenn die IDs von den Unterkategorien durcheinander sein können usw.

      Ich warte mal was ramius sagt. :)
    • Habe dir etwas zusammengeschrieben, was dir als Ansatz ausreichen sollte. Den Feinschliff musst du natürlich selbst vornehmen ;)

      Struktur der Datenbank Tabelle

      Quellcode

      1. ID int(11)
      2. refID int(11)
      3. pos int(11)
      4. name varchar(255)

      Inhalt der Datenbank Tabelle

      Quellcode

      1. ID refID pos name
      2. 1 0 1 PHP
      3. 2 0 0 mySQL
      4. 3 2 0 SELECT
      5. 4 2 2 UPDATE
      6. 5 2 3 DELETE
      7. 6 2 1 INSERT
      8. 7 1 0 echo
      9. 8 1 1 print_r
      10. 9 1 2 var_dump
      11. 10 6 0 ON DUPLICATE KEY
      Alles anzeigen

      PHP Quelltext

      PHP-Quellcode

      1. // Rekursive Funktion zum Ausgeben der Kind-Elemente
      2. function displayChild($id, &$list) {
      3. // Ausgabe des Elements
      4. echo '<li>'.$list[$id]['name'].'</li>';
      5. // Aufruf von displayChild für Kind-Elemente
      6. if(!empty($list[$id]['children'])) {
      7. ksort($list[$id]['children'], SORT_NUMERIC); // Sortieren der Kind-Elemente
      8. echo '<ul>';
      9. foreach($list[$id]['children'] AS $childID) displayChild($childID, $list); //Rekursion
      10. echo '</ul>';
      11. }
      12. }
      13. // Auslesen der Einträge
      14. $sql = "SELECT *
      15. FROM tabelle";
      16. $result = mysql_query($sql);
      17. $list = array();
      18. while($row = mysql_fetch_assoc($result)) {
      19. $list[$row['ID']] = $row;
      20. $list[$row['ID']]['children'] = array();
      21. }
      22. // Zuweisen von Kind-Einträgen
      23. $root = array();
      24. foreach($list AS $entry) {
      25. if($entry['refID']) $list[$entry['refID']]['children'][$entry['pos']] = $entry['ID'];
      26. else $root[$entry['pos']] = $entry['ID'];
      27. }
      28. // Ausgabe der Liste
      29. ksort($root, SORT_NUMERIC); // Sortieren des Stamms
      30. echo '<ul>';
      31. foreach($root AS $id) {
      32. displayChild($id, $list);
      33. }
      34. echo '</ul>';
      Alles anzeigen

      Ausgabe
      • mySQL
        • SELECT
        • INSERT
          • ON DUPLICATE KEY
        • UPDATE
        • DELETE
      • PHP
        • echo
        • print_r
        • var_dump

      HTML-Quellcode

      1. <ul>
      2. <li>mySQL</li>
      3. <li>
      4. <ul>
      5. <li>SELECT</li>
      6. <li>INSERT</li>
      7. <li>
      8. <ul>
      9. <li>ON DUPLICATE KEY</li>
      10. </ul>
      11. </li>
      12. <li>UPDATE</li>
      13. <li>DELETE</li>
      14. </ul>
      15. </li>
      16. <li>PHP</li>
      17. <li>
      18. <ul>
      19. <li>echo</li>
      20. <li>print_r</li>
      21. <li>var_dump</li>
      22. </ul>
      23. </li>
      24. </ul>
      Alles anzeigen