Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Array rekursiv auslesen mit Starttiefe

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Array rekursiv auslesen mit Starttiefe

    Hey Leute, ich quäle mich jetzt schon seit 4 Tagen mit folgendem Problem und hoffe, dass mir jemand helfen kann.

    Ich habe eine Navigation (mit n Untermenüs) in einem Array und möchte den Inhalt rekursiv auslesen und ausgeben. An sich kein Problem. Nur möchte ich die maximale Tiefe bestimmen, was auch nicht schwer ist und ich möchte eine StartID mitgeben, wo mein Problem dann losgeht.

    Das heißt, dass ich meiner Funktion eine ParentID mitgeben möchte und sie mir nur die Elemente und Kindelemente usw... ausgeben soll, die unter der ParentID stehen. Das klappt aber leider noch nicht wirklich.

    PHP-Code:
    function foo($menu_array$elternMenuID 4$tiefe 0$maxTiefe = -1) {
      
    $tiefe++;
      foreach (
    $menu_array as $eintrag) {
        if (
    $eintrag->elternID() == $elternMenuID) {
          
    //Text ausgeben
        
    }
        
    $unterMenu $eintrag->unterMenu();
        
    foo($unterMenu$eintrag->getID(), $tiefe$maxTiefe);
      }
      return;

    Hier mal der Aufbau des Arrays, welches beim ersten Aufruf an die Funktion foo(...) übergeben wird
    PHP-Code:
    array(1) {
      [
    0]=>
      
    object(TM_Menu)#3 (7) {
        
    ["id":"TM_Menu":private]=>
        
    string(1"1"
        
    ["text":"TM_Menu":private]=>
        
    string(9"Downloads"
        
    ["parent_id":"TM_Menu":private]=>
        
    string(1"0"
        
    ["sub_menu_array":"TM_Menu":private]=>
        array(
    2) {
          [
    0]=>
          
    object(TM_Menu)#2 (7) {
            
    ["id":"TM_Menu":private]=>
            
    string(1"2"
            
    ["text":"TM_Menu":private]=>
            
    string(8"Software"
            
    ["parent_id":"TM_Menu":private]=>
            
    string(1"1"
            
    ["sub_menu_array":"TM_Menu":private]=>
            array(
    2) {
              [
    0]=>
              
    object(TM_Menu)#4 (7) {
                
    ["id":"TM_Menu":private]=>
                
    string(1"3"
                
    ["text":"TM_Menu":private]=>
                
    string(9"Programme"
                
    ["parent_id":"TM_Menu":private]=>
                
    string(1"2"
                
    ["sub_menu_array":"TM_Menu":private]=>
                array(
    0) {
                }
              }
              [
    1]=>
              
    object(TM_Menu)#5 (7) {
                
    ["id":"TM_Menu":private]=>
                
    string(1"4"
                
    ["text":"TM_Menu":private]=>
                
    string(6"Spiele"
                
    ["parent_id":"TM_Menu":private]=>
                
    string(1"2"
                
    ["sub_menu_array":"TM_Menu":private]=>
                array(
    0) {
                }
              }
            }
          }
          [
    1]=>
          
    object(TM_Menu)#6 (7) {
            
    ["id":"TM_Menu":private]=>
            
    string(1"5"
            
    ["text":"TM_Menu":private]=>
            
    string(6"Bilder"
            
    ["parent_id":"TM_Menu":private]=>
            
    string(1"1"
            
    ["sub_menu_array":"TM_Menu":private]=>
            array(
    1) {
              [
    0]=>
              
    object(TM_Menu)#7 (7) {
                
    ["id":"TM_Menu":private]=>
                
    string(1"6"
                
    ["text":"TM_Menu":private]=>
                
    string(16"Landschaftsfotos"
                
    ["parent_id":"TM_Menu":private]=>
                
    string(1"5"
                
    ["sub_menu_array":"TM_Menu":private]=>
                array(
    0) {
                }
              }
            }
          }
        }
      }

    Vielen Dank schonmal für eure Hilfe.
    Ich hoffe, dass mir jemand helfen kann.

  • #2
    Willkommen im Forum!

    Ich habe mal probiert, ein lauffähiges Beispiel zu basteln, das denjenigen Zweig (?) (also den Unterbaum ) einer Baumstruktur ausgibt, der an einem Element mit $parentId hängt.

    (array2Tree ist eine Hilfsfunktion zur Erzeugung eines Baums, weil ich gerade keine gescheiten anderen Daten da habe als das, was in $menu steht.)

    Edit: Es scheint noch nicht ganz rund zu laufen. Vielleicht editiere ich gleich noch mal.
    Edit 2: Nun müsste es klappen.

    PHP-Code:
    <?php

    function array2Tree(array $a$parent null)
    {
        
    $ret = array();

        foreach (
    $a as $entry) {
            if (
    $entry[1] == $parent) {
                
    $ret[] = array(
                    
    'id'        => $entry[0],
                    
    'parent_id' => $parent,
                    
    'text'      => $entry[2],
                    
    'children'  => array2Tree($a$entry[0])
                );
            }
        }

        return 
    $ret;
    }

    function 
    getSubTree(array $tree$parentId)
    {
        if (
    $parentId == null) {
            return 
    $tree;
        }

        
    $ret = array();

        foreach (
    $tree as $node) {
            if (
    $node['parent_id'] == $parentId) {
                
    $ret[] = $node;
            } else {
                if (
    count($node['children']) > 0) {
                    
    $test getSubTree($node['children'], $parentId);
                    if (
    count($test) > 0) {
                        
    $ret $test;
                        break;
                    }
                }
            }
        }

        return 
    $ret;
    }

    $menu = array(
         
    // 0   1          2
         // id  parent_id  text
      
    array( 1,      null'Item 1'),
      array( 
    2,      null'Item 2'),
        array( 
    3,         1'Item 1.1'),
        array( 
    4,         2'Item 2.1'),
        array( 
    5,         2'Item 2.2'),
        array( 
    6,         1'Item 1.2'),
          array( 
    7,         4'Item 2.1.1'),
            array( 
    8,         7'Item 2.1.1.1'),
            array( 
    9,         7'Item 2.1.1.2'),
              array( 
    10,         9'Item 2.1.1.2.1'),
      array( 
    11,      null'Item 3')
    );

    $tree array2Tree($menunull);

    $subTree getSubTree($tree7);

    print_r($subTree);

    Kommentar


    • #3
      Hey vielen Dank für deine schnelle Antwort.
      Ich hoffe, dass es mein Problem löst.

      Werde es nachher gleich mal testen =)

      Kommentar


      • #4
        Hey das ganze löst mein Problem leider nicht. =(

        Es soll ja so sein, dass ich z.B. der Funktion dein array übergebe und z.B. die ID 4. Und jetzt soll die Funktion alles ausgeben, was als parentID 4 hat.

        Das wäre bei deinem Beispiel: array( 7, 4, 'Item 2.1.1')
        Jetzt soll er aber rekursiv durchgehen und auch alles ausgeben, was jetzt als parentID 7 hat usw...

        Ich hoffe, du verstehst, was ich meine.

        Kommentar


        • #5
          Zitat von ToM_ToM Beitrag anzeigen
          Hey das ganze löst mein Problem leider nicht. =(

          Es soll ja so sein, dass ich z.B. der Funktion dein array übergebe und z.B. die ID 4. Und jetzt soll die Funktion alles ausgeben, was als parentID 4 hat.

          Das wäre bei deinem Beispiel: array( 7, 4, 'Item 2.1.1')
          Jetzt soll er aber rekursiv durchgehen und auch alles ausgeben, was jetzt als parentID 7 hat usw...

          Ich hoffe, du verstehst, was ich meine.
          Hä?

          Wie wäre es, wenn du dich entweder mal entscheidest, was du willst... oder aber zumindest mal die Aufgabenstellung von Anfang an vollständig beschreibst

          Wie bei Kunden.. die kommen auch immer, wenn man fast fertig ist und wollen "nur noch dies und das und jenes und welches und solches..."
          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

          Kommentar


          • #6
            Eigentlich hatte ich das oben erwähnt.
            Das heißt, dass ich meiner Funktion eine ParentID mitgeben möchte und sie mir nur die Elemente und Kindelemente usw... ausgeben soll, die unter der ParentID stehen.
            Aber entschuldige, falls es nicht deutlich genug rüberkam.

            Kommentar


            • #7
              Dann wirst du wohl mehr als einen Aufruf machen müssen, um alle gewünschten Informationen zu erhalten...

              ENTWEDER nacht parent_id 4 suchen ODER nach parent_id 7 - beides zusammen geht halt nicht (und ich vermute mal, das sich die parent_id 7 aus dem Datensatz ergibt, der die parent_id 4 hat - oder?)
              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

              Kommentar


              • #8
                Zitat von ToM_ToM Beitrag anzeigen
                Ich hoffe, du verstehst, was ich meine.
                Eigentlich hatte ich gedacht, genau das programmiert zu haben.

                PHP-Code:
                <?php

                function array2Tree(array $a$parent null)
                {
                    
                $ret = array();

                    foreach (
                $a as $entry) {
                        if (
                $entry[1] == $parent) {
                            
                $ret[] = array(
                                
                'id'        => $entry[0],
                                
                'parent_id' => $parent,
                                
                'text'      => $entry[2],
                                
                'children'  => array2Tree($a$entry[0])
                            );
                        }
                    }

                    return 
                $ret;
                }

                function 
                getSubTree(array $tree$parentId)
                {
                    if (
                $parentId == null) {
                        return 
                $tree;
                    }

                    
                $ret = array();

                    foreach (
                $tree as $node) {
                        if (
                $node['parent_id'] == $parentId) {
                            
                $ret[] = $node;
                        } else {
                            if (
                count($node['children']) > 0) {
                                
                $test getSubTree($node['children'], $parentId);
                                if (
                count($test) > 0) {
                                    
                $ret $test;
                                    break;
                                }
                            }
                        }
                    }

                    return 
                $ret;
                }

                function 
                display(array $a$depth 0)
                {
                    foreach (
                $a as $node) {
                        echo 
                str_repeat(' '$depth 4) . $node['id'] . ': ' $node['text'] . "\n";
                        
                display($node['children'], $depth 1);
                    }
                }

                $menu = array(
                     
                // 0   1          2
                     // id  parent_id  text
                  
                array( 1,      null'Item 1'),
                  array( 
                2,      null'Item 2'),
                    array( 
                3,         1'Item 1.1'),
                    array( 
                4,         2'Item 2.1'),
                    array( 
                5,         2'Item 2.2'),
                    array( 
                6,         1'Item 1.2'),
                      array( 
                7,         4'Item 2.1.1'),
                        array( 
                8,         7'Item 2.1.1.1'),
                        array( 
                9,         7'Item 2.1.1.2'),
                          array( 
                10,         9'Item 2.1.1.2.1'),
                  array( 
                11,      null'Item 3')
                );

                echo 
                "<pre>Originalbaum:\n\n";

                $tree array2Tree($menunull);
                display($tree);

                echo 
                "\n\nparentId 2:\n\n";

                $subTree getSubTree($tree2);
                display($subTree);

                echo 
                "\n\nparentId 7:\n\n";

                $subTree getSubTree($tree7);
                display($subTree);
                Ausgabe:

                Code:
                Originalbaum:
                
                1: Item 1
                    3: Item 1.1
                    6: Item 1.2
                2: Item 2
                    4: Item 2.1
                        7: Item 2.1.1
                            8: Item 2.1.1.1
                            9: Item 2.1.1.2
                                10: Item 2.1.1.2.1
                    5: Item 2.2
                11: Item 3
                
                
                parentId 2:
                
                4: Item 2.1
                    7: Item 2.1.1
                        8: Item 2.1.1.1
                        9: Item 2.1.1.2
                            10: Item 2.1.1.2.1
                5: Item 2.2
                
                
                parentId 7:
                
                8: Item 2.1.1.1
                9: Item 2.1.1.2
                    10: Item 2.1.1.2.1
                So soll es nicht sein?

                Kommentar


                • #9
                  Hey vielen Dank mermshaus.

                  Jetzt funktioniert es =) Ich hatte einen Denkfehler drin, weil ich das obektorientiert gelöst habe.

                  Kommentar

                  Lädt...
                  X