Array durch rekursive Methode füllen schlägt fehl, aber echo Ausgabe ist richtig

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

  • Array durch rekursive Methode füllen schlägt fehl, aber echo Ausgabe ist richtig

    Hallo alle,

    ich habe einen kleinen Config Auszug als Json Format.

    Code:
    "acl" : {
    		"roles" : [
    			{
    				"guest" : null
    			},
    			{
    				"user" : {
    					"parent" : "guest"
    				}
    			},
    			{
    				"premiumuser" : {
    					"parent" : "user"
    				}
    			},
    			{
    				"customer" : {
    					"parent" : "guest"
    				}
    			},
    			{
    				"moderator" : {
    					"parent" : "premiumuser"
    				}
    			},
    			{
    				"admin" : null
    			}
    		]
    }
    Und versuche nun die Ebenen die aufeinander aufbauen in eine Array zu schreiben, das schlägt aber fehl.

    Folgende print_r Ausgabe kommt zustande.

    Code:
    Array
    (
        [0] => moderator
        [1] => moderator
    )
    Die echo Ausgabe sieht aber korrekt aus, es werden alle Ebenen angezeigt.

    Code:
    guest
    user
    premiumuser
    moderator
    Und hier die Methode.

    PHP-Code:
    protected function _mergeParents($role)
        {
            
    $parents = array();
            
            if (
    null !== $role) {
                
                foreach (
    $this->_aclConfig['acl']['roles'] as $key => $value) {

                    if (
    array_key_exists($role$value)) {
                        
    $parents[] = $role;
                        
                        if (
    null !== $value[$role]['parent']) {
                            
    $this->_mergeParents($value[$role]['parent']);
                            
    $parents[] = $role;
                            echo 
    $role '<br>';
                        } else {
                            
                            foreach (
    $value as $lKey => $lValue) {
                                
    $parents[] = $lKey;
                                echo 
    $lKey '<br>';
                            }
                        }
                    }
                }
                
                return 
    $parents;
            }
        } 
    Und der Methodenaufruf in einer anderen Methode.

    PHP-Code:
    $mergeParents $this->_mergeParents($pRole);
    echo 
    '<pre>'print_r($mergeParents); echo '</pre>'
    Kann mir jemand sagen wo ich beim befüllen des Arrays den Fehler mache?

    Danke für eure Hilfe Gruß der Litter
    Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
    http://www.lit-web.de

  • #2
    Hallo,

    der Rückgabewert des rekursiven Aufrufs wird nirgends verwertet, also arbeitet die Funktion genauso, als würdest du gar keinen rekursiven Aufruf tätigen.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Wie meinst du das ich verarbeiten den rueckgabewert nicht? Heißt das da wo ich die Methode aufrufe muesste ich eigentlich ne Zuweisung machen und mit dem wert dann weiter arbeiten?
      Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
      http://www.lit-web.de

      Kommentar


      • #4
        Mir ist nicht klar, was du erreichen möchtest.

        Wie genau soll die Ausgabe aussehen?

        Kommentar


        • #5
          Zitat von mermshaus Beitrag anzeigen
          Mir ist nicht klar, was du erreichen möchtest.

          Wie genau soll die Ausgabe aussehen?
          Ich will die Vererbungshierarchie ausgeben vom Moderator bis zum Guest. Also so wie die Echo Ausgabe im ersten Post, nur eben als Array welches durch den rekursiven Aufruf gefüllt wird.

          Ich werde mich morgen da noch mal dran setzen. Ich glaube verstanden zu haben was Amica da schrieb, zumindest hoffe ich das.
          Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
          http://www.lit-web.de

          Kommentar


          • #6
            Zitat von litterauspirna Beitrag anzeigen
            Wie meinst du das ich verarbeiten den rueckgabewert nicht? Heißt das da wo ich die Methode aufrufe muesste ich eigentlich ne Zuweisung machen und mit dem wert dann weiter arbeiten?
            Sie meint, dass die bisher gefundenen Parents im Falle einer Rekursion nicht an die Methode übergeben werden. Somit gehen alle bisher gefundenen Parents verloren.

            Deine Methode müsste folgendermaßen aussehen, damit sie richtig funktioniert:
            PHP-Code:
            protected function _mergeParents($role$parents = array()) { } 
            Du speicherst die gefundenen Eltern in dem Array $parents. Dieses musst Du bei jedem erneuten rekursiven Aufruf wieder an die Methode übergeben, so dass die bisher gefundenen Eltern beibehalten werden.

            Alles klar soweit?
            MM Newmedia | MeinBlog

            Kommentar


            • #7
              Hey Ezkimo,

              also was ich vermutet habe war schon richtig.

              Das hier,

              PHP-Code:
              protected function _mergeParents($role)
                  {
                      
              $this->_parents = array();
                      
                      if (
              null !== $role) {
                          
                          foreach (
              $this->_aclConfig['acl']['roles'] as $key => $value) {

                              if (
              array_key_exists($role$value)) {
                                  if (
              null !== $value[$role]['parent']) {
                                      
              $this->_parents $this->_mergeParents($value[$role]['parent']);
                                      
              $this->_parents[] = $role;
                                  } else {
                                      
                                      foreach (
              $value as $lKey => $lValue) {
                                          
              $this->_parents[] = $lKey;
                                      }
                                  }
                              }
                          }
                          
                          return 
              $this->_parents;
                      }
                  } 
              bringt den erwünschten Erfolg.

              Hier die Ausgabe.

              Code:
              Array
              (
                  [0] => guest
                  [1] => user
                  [2] => premiumuser
                  [3] => moderator
              )
              Ich danke für eure Antworten und Hilfe.

              Gruß der Litter
              Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
              http://www.lit-web.de

              Kommentar

              Lädt...
              X