Ankündigung

Einklappen
Keine Ankündigung bisher.

Menübaum aus einem mehrdimensionalem Array erstellen (rekursiv)

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Menübaum aus einem mehrdimensionalem Array erstellen (rekursiv)

    Hallo,

    ich habe jetzt schon vile hier im Forum gelesen und auch den guten alten Freund "Google" zu rate gezogen, doch habe ich keine Lösung gefunden, wie ich aus meinem Array einen Menübaum erstellen kann.
    Wenn ich Besipiele nutze funktioniert es, aber auch nur mit den mitgegeben Daten des Beispiels. Ich bekomme bei meinem Array entweder kein Ergebnis oder er sagt, dass ich mein stdClass Object Array nicht nutzen kann.
    Hat jemand eine Idee, wie ich weiter komme?
    Was ich schon herausgefunden habe ist, dass es sich um ein mehrdimensionales Array handelt, welches rekursiv ablaufen muss.

    Mein Array:

    Array ( [0] => stdClass Object ( [Treehouse_ID] => 1 [Treehouse_Titel] => MASTER [Treehouse_PreID] => ) [1] => stdClass Object ( [Treehouse_ID] => 2 [Treehouse_Titel] => DEMO [Treehouse_PreID] => ) [2] => stdClass Object ( [Treehouse_ID] => 3 [Treehouse_Titel] => TEST [Treehouse_PreID] => ) [3] => stdClass Object ( [Treehouse_ID] => 4 [Treehouse_Titel] => Demo A [Treehouse_PreID] => 2 ) [4] => stdClass Object ( [Treehouse_ID] => 5 [Treehouse_Titel] => Demo B [Treehouse_PreID] => 2 ) [5] => stdClass Object ( [Treehouse_ID] => 6 [Treehouse_Titel] => Demo1 [Treehouse_PreID] => 4 ) [6] => stdClass Object ( [Treehouse_ID] => 7 [Treehouse_Titel] => Demo2 [Treehouse_PreID] => 4 ) [7] => stdClass Object ( [Treehouse_ID] => 8 [Treehouse_Titel] => Demo1-1 [Treehouse_PreID] => 6 ) [8] => stdClass Object ( [Treehouse_ID] => 9 [Treehouse_Titel] => Demo1-2 [Treehouse_PreID] => 6 ) [9] => stdClass Object ( [Treehouse_ID] => 10 [Treehouse_Titel] => Demo1-2-1 [Treehouse_PreID] => 9 ) )

    Aufbau in der SQL Datenbank:

    Bildschirmfoto 2019-02-06 um 21.39.27.png

    Ich bin für jede Hilfe dankbar.

    Gruss Cerberus

  • #2
    Wie liest du denn das aus der DB aus?

    Kommentar


    • #3
      1. liefer doch mal echte Daten, mit var_export zum Beispiel, oder als JSON - wie soll denn hier jemand die Beispieldaten aus print_r oder einem Screenshot was anfangen? Du musst es den Leuten hier nicht extra schwer machen wenn du Hilfe suchst.
      2. wo ist der Code den du ausprobiert hast? Links zu den Quellen? So kann doch auch keiner was mit irgendeiner verstümmelten Fehlermeldung anfangen.
      3. Hast du nicht mal selber versucht eine Funktion dafür zu schreiben?
      [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

      Kommentar


      • #4
        Zitat von chorn Beitrag anzeigen
        1. liefer doch mal echte Daten, mit var_export zum Beispiel, oder als JSON - wie soll denn hier jemand die Beispieldaten aus print_r oder einem Screenshot was anfangen? Du musst es den Leuten hier nicht extra schwer machen wenn du Hilfe suchst.
        Diese verstümmelten print_r oder var_dump Ausgaben ärgert mich auch immer. Da sein Array auch stdClass Objecte enthält, ist für den Datenexport die Funktion dump_arrobj() hier aus der Wissenssammlung zu empfehlen.

        Kommentar


        • #5
          Zitat von Cerberus591 Beitrag anzeigen
          Wenn ich Besipiele nutze funktioniert es, aber auch nur mit den mitgegeben Daten des Beispiels. Ich bekomme bei meinem Array entweder kein Ergebnis oder er sagt, dass ich mein stdClass Object Array nicht nutzen kann.
          Hat jemand eine Idee, wie ich weiter komme?
          (..)
          Was ich schon herausgefunden habe ist, dass es sich um ein mehrdimensionales Array handelt, welches rekursiv ablaufen muss.
          nein, ist es eben nicht, sondern ein array bestehend aus einer liste stdclass .
          wie in #2 erwähnt scheint es ein db lesefehler, möglicherweise so:

          http://php.net/manual/de/pdostatement.fetchobject.php

          herbeigeführt.

          Kommentar


          • #6
            Hallo,
            danke für das positive Feedback!

            ich lese aus der Datenbank so aus:

            $db1 = JFactory::getDbo();
            $db1->setQuery("SELECT DISTINCT D, Titel, ParentID FROM #__TreeDB ");
            $result1 = $db1->loadObjectList();
            print_R ($result1);


            echo "<table border=1>";
            echo " <tr> ";
            echo " <th>ID</th> <th>Titel</th> <th>ParentID</th>";
            echo " </tr>";
            foreach( $result1 as $zeile1) {
            echo "<tr><td>". $zeile1->ID."</td><td>".$zeile1->Titel ."</td><td>". $zeile1->ParentID."</td></tr>";
            }
            echo " </table>";


            Per Var_Export sieht es so aus:

            array ( 0 => stdClass::__set_state(array( 'ID' => '1', 'Titel' => 'MASTER', 'PreID' => '', )), 1 => stdClass::__set_state(array( 'ID' => '2', 'Titel' => 'DEMO', 'PreID' => '', )), 2 => stdClass::__set_state(array( 'ID' => '3', 'Titel' => 'TEST', 'PreID' => '', )), 3 => stdClass::__set_state(array( 'ID' => '4', 'Titel' => 'Demo A', 'PreID' => '2', )), 4 => stdClass::__set_state(array( 'ID' => '5', 'Titel' => 'Demo B', 'PreID' => '2', )), 5 => stdClass::__set_state(array( 'ID' => '6', 'Titel' => 'Demo1', 'PreID' => '4', )), 6 => stdClass::__set_state(array( 'ID' => '7', 'Titel' => 'Demo2', 'PreID' => '4', )), 7 => stdClass::__set_state(array( 'ID' => '8', 'Titel' => 'Demo1-1', 'PreID' => '6', )), 8 => stdClass::__set_state(array( 'ID' => '9', 'Titel' => 'Demo1-2', 'PreID' => '6', )), 9 => stdClass::__set_state(array( 'ID' => '10', 'Titel' => 'Demo1-2-1', 'PreID' => '9', )), )

            ich habe z.B. den code hier probiert:

            $menuItems = array( [ 'id' => 1, 'name' => 'Main Menu 1', 'main' => 1, 'parent_id' => null ], ['id' => 9,'name' => 'Main Menu 2','main' => 1,'parent_id' => null], ['id' => 10,'name' => 'Main Menu 3','main' => 1,'parent_id' => null], ['id' => 11,'name' => 'Sub Menu 1.1','main' => null,'parent_id' => 1], ['id' => 12,'name' => 'Sub Menu 1.2','main' => null,'parent_id' => 1], ['id' => 13,'name' => 'Sub Menu 1.3','main' => null,'parent_id' => 1], ['id' => 14,'name' => 'Sub Menu 1.2.1','main' => null,'parent_id' => 12], ['id' => 15,'name' => 'Sub Menu 1.2.1','main' => null,'parent_id' => 12], ['id' => 16,'name' => 'Sub Menu 3.1','main' => null,'parent_id' => 10,], ['id' => 17,'name' => 'Sub Menu 3.2','main' => null,'parent_id' => 10], ['id' => 18,'name' => 'Sub Menu 3.2.1','main' => null,'parent_id' => 17], ['id' => 19,'name' => 'Sub Menu 3.2.2','main' => null,'parent_id' => 17] );


            foreach ($menuItems as $menu) { $parentsIds[$menu['id']] = $menu['parent_id']; } function parseAndPrintTree($root, $tree) { global $menuItems; $return = array(); if(!is_null($tree) && count($tree) > 0) { echo '<ul>'; foreach($tree as $child => $parent) { if($parent == $root) { unset($tree[$child]); foreach ($menuItems as $row) { if($row['id'] == $child) echo "<li><a href='?menu=".$row['id']."'>".$row['name']. </a>"; } parseAndPrintTree($child, $tree); echo '</li>'; } } echo '</ul>'; } } parseAndPrintTree(0,$parentsIds);

            Dort funktionierte es mit dem Test Array aber nicht mit dem aus meiner Datenbank.

            Gruss Cerberus

            Kommentar


            • #7
              Das ist ein CMS, in diesem Fall mal Joomla, da solltest du die Frage besser in einem Joomla Forum stellen.

              Bitte beachten!
              https://www.php.de/articles/regeln-u...twareprodukten

              Kommentar


              • #8
                Gibt es denn die Möglichkeit dies auch auf reinem PHP zu erstellen?

                Sorry ich bin Anfänger und bin neu dabei.

                Kommentar


                • #9
                  Ja und nein.
                  Ja dahingehend dass auch Joomla in PHP programmiert wurde.
                  Nein weil dein CMS nach gewissen Regeln funktioniert und eine direkte Ausgabe wohl gar nicht zulassen würde.
                  Schaue in die Dokumentation zu deinem CMS um genaueres zu erfahren.

                  Kommentar


                  • #10
                    Danke Protestix für die konstruktive Antwort.
                    Ich schaue dort noch mal, ob ich etwas finde.

                    Kommentar


                    • #11
                      Versuche es mal mit loadAssocList() (statt loadObjectList()), dann bekommst du ein normales assoziatives Array.
                      sorry, shift-taste kaputt

                      Kommentar


                      • #12
                        Bitte nutze code tags zeilenumbrüche, deine posts sind nichrtr angenehm zu lesen.

                        Kommentar

                        Lädt...
                        X