Problem - Rekursive Funktion + return

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

  • Problem - Rekursive Funktion + return

    Ahoii ahoii!!!

    Ich hab ein Problem mit einer rekursiven Funktion!
    PHP-Code:
    function gallist($var$depth=0, &$cnt=0$sub=0) {
        
    $i = -1;
        
    $g_out = array();
        FOREACH (
    $var as $val) {
            
    $i++;
            
    $rueck $depth 16;
            
    // Class ändern wenn subgallery
            
    IF ($sub != 0) {
              
    $class "norm";     
            } ELSE {  
              
    $class "bold";     
            }
            echo 
    "Debug: ".$cnt." - ".$rueck." - ".$val[0]["name"]."<BR>";
            
    //$g_out[$cnt] = array('id' => $val[0]["id"], 'name' => $val[0]["name"], 'depth' => $rueck, 'class' => $class);
            
    IF (isset($val["SUB"])) {
                
    $cnt++;
                
    $anzahl = isset($val["SUB"]) ? count($val["SUB"]) : 0;
                
    gallist($val["SUB"], $depth+1$cnt$anzahl);
            }
            
    $cnt++;
        }
        return 
    $g_out;

    Diese sollte eigentlich ein ARRAY (=$g_out) zurückgeben das verschiedene Werte (mehrdimensional) hat.
    Leider bekomme ich aber nur dann etwas zurück, wenn sich die Funktion selbst aufruft, sonst aber nicht!

    Kann mal bitte einer einen Blick drauf werfen!?
    Die Ausgabe der Funktion kann (inkl. Debug) hier eingesehen werden!
    WHILE (!$asleep) { $sheep++; }

  • #2
    Zitat von nichtsooft Beitrag anzeigen
    Diese sollte eigentlich ein ARRAY (=$g_out) zurückgeben das verschiedene Werte (mehrdimensional) hat.
    Kannst du das Präzisieren? Was erwartest du als Rückgabe?
    Ansonsten würde ich erstmal raten, die Rückgabe des rekursiven Aufrufs auch entgegen zu nehmen!
    $g_out = gallist(...);

    Kommentar


    • #3
      Genauere Angaben... Hmm... Nunja;

      Ich erwarte mir daß ich ein gesammeltes Array in folgender Form
      "Array ([id],[name],[depth],[class])" für alle Galerien und Subgalerien zurück bekomme! -> Es geht also um die auskommentierte Zeile
      Leider werden lediglich alle Subgalerien (also die Rückgaben der rekursiven Aufrufe) ins Array eingefügt und alle "normalen" ( != rekursiven) Aufrufe werden übergangen!

      Man sieht auf der geposteten Beispielseite sehr gut worum's geht!
      WHILE (!$asleep) { $sheep++; }

      Kommentar


      • #4
        Du initialisierst zu Beginn ein Array, gibst es am Ende zurück - und machst dazwischen absolut gar nichts damit, fügst keinen einzigen Wert ein.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Zitat von wahsaga Beitrag anzeigen
          Du initialisierst zu Beginn ein Array, gibst es am Ende zurück - und machst dazwischen absolut gar nichts damit, fügst keinen einzigen Wert ein.
          Ja, weil die betreffende Zeile hier im geposteten Script auskommentiert ist!

          Also nochmal für dich wahsaga:
          PHP-Code:
          function gallist($var$depth=0, &$cnt=0$sub=0) {
              
          $i = -1;
              
          $g_out = array();
              FOREACH (
          $var as $val) {
                  
          $i++;
                  
          $rueck $depth 16;
                  
          // Class ändern wenn subgallery
                  
          IF ($sub != 0) {
                    
          $class "norm";     
                  } ELSE {  
                    
          $class "bold";     
                  }
                  
          // DEBUG echo Meldung
                  
          echo "Debug: ".$cnt." - ".$rueck." - ".$val[0]["name"]."<BR>";
                  
          // Array $g_out befüllen
                  
          $g_out[$cnt] = array('id' => $val[0]["id"], 'name' => $val[0]["name"], 'depth' => $rueck'class' => $class);
                  IF (isset(
          $val["SUB"])) {
                      
          $cnt++;
                      
          $anzahl = isset($val["SUB"]) ? count($val["SUB"]) : 0;
                      
          gallist($val["SUB"], $depth+1$cnt$anzahl);
                  }
                  
          $cnt++;
              }
              return 
          $g_out;

          Aufruf der Funktion läuft so ab: gallist(get_categories($galari))
          Wenn du die get_categories() auch noch gepostet haben willst, gib bescheid...
          Zuletzt geändert von nichtsooft; 21.06.2009, 12:44.
          WHILE (!$asleep) { $sheep++; }

          Kommentar


          • #6
            Weiterhin wertest du die Rückgabe des rekursiven Aufrufes nicht aus!
            Vermutlich fehlt dort ein Array_merge()

            Bisher verstehe ich deine Datentruktur und deine Absicht nicht ganz.
            Zuletzt geändert von combie; 21.06.2009, 12:48.
            Wir werden alle sterben

            Kommentar


            • #7
              Zitat von combie Beitrag anzeigen
              Bisher verstehe ich deine Datentruktur und deine Absicht nicht ganz.
              Es wird ein Array zurückgegeben mit dessen Hilfe ich ein Pulldown-Menü befüllen will! Ich will bloß nicht schon in der Funktion ein echo"<option>...</option>"; drinnen haben, desshalb die Rückgabe des Arrays.
              Die Absicht erklärt denk ich die Struktur des Arrays...

              Zitat von combie Beitrag anzeigen
              Weiterhin wertest du die Rückgabe des rekursiven Aufrufes nicht aus!
              Ist aber interessant, dass ich dann genau dafür Werte im Array hab und bei den nicht rekursiven Aufrufen nicht!
              Zuletzt geändert von nichtsooft; 21.06.2009, 12:51.
              WHILE (!$asleep) { $sheep++; }

              Kommentar


              • #8
                Zitat von nichtsooft Beitrag anzeigen
                Ja, weil die betreffende Zeile hier im geposteten Script auskommentiert ist!
                Ach nee ... die Stelle, an der du da etwas in das Array schreibst, ist aber unsinnig.

                Deine Funktion gallist gibt ein Array zurück - und was machst du mit diesem an der Stelle, wo du die Funktion (innerhalb ihrer selbst) aufrufst?
                Nichts, Nada, Niente ... du wirfst die Rückgabe einfach weg.


                So, wie du das derzeit machst, kannst du nur einen einzigen Eintrag in deinem Array bekommen - den vom Aufruf auf oberster Ebene.

                Entweder übergibst du ein Array per reference - dann kannst du auf jeder Ebene neue Einträge machen.
                Oder du legst die Rückgabe des Funktionsaufrufes jeweils in einem neuen Array-Element ab - dann bekommst du letztendlich ein mehrdimensionales Array heraus.
                I don't believe in rebirth. Actually, I never did in my whole lives.

                Kommentar


                • #9
                  Zitat von wahsaga Beitrag anzeigen
                  ...So, wie du das derzeit machst, kannst du nur einen einzigen Eintrag in deinem Array bekommen - den vom Aufruf auf oberster Ebene.
                  Also ich bekomme abgesehen von den "Debug-Zeilen" folgendes zurück:
                  [0] Array ( [id] => 56 [name] => Zusätzliches [depth] => 0 [class] => bold )
                  [1] Array ( [id] => 4 [name] => Schuljahr 2008/2009 [depth] => 0 [class] => bold )
                  [2] Array ( [id] => 3 [name] => Schuljahr 2007/2008 [depth] => 0 [class] => bold )
                  [3] Array ( [id] => 2 [name] => Schuljahr 2006/2007 [depth] => 0 [class] => bold )
                  [4] Array ( [id] => 1 [name] => Schuljahr 2005/2006 [depth] => 0 [class] => bold )


                  Zitat von wahsaga Beitrag anzeigen
                  Deine Funktion gallist gibt ein Array zurück - und was machst du mit diesem an der Stelle ... du wirfst die Rückgabe einfach weg ... Oder du legst die Rückgabe des Funktionsaufrufes jeweils in einem neuen Array-Element ab - dann bekommst du letztendlich ein mehrdimensionales Array heraus.
                  Nun ich dachte eigenlich dass ich durch die Indizierung $array[$steigender_key][$werte] jeweils ein neues Array-Element schaffe und befülle!?
                  Zuletzt geändert von nichtsooft; 21.06.2009, 13:01.
                  WHILE (!$asleep) { $sheep++; }

                  Kommentar


                  • #10
                    Zitat von nichtsooft Beitrag anzeigen
                    Also ich bekomme abgesehen von den "Debug-Zeilen" folgendes zurück:
                    Gut, ja - durch die foreach-Schleife bekommst du ggf. mehrere Einträge auf einer Ebene.

                    Nun ich dachte eigenlich dass ich durch die Indizierung $array[$steigender_key][$werte] jeweils ein neues Array-Element schaffe und befülle!?
                    Ja - auf jeder "Ebene".
                    Und dein auf der aktuellen Ebene befülltes, neues Array gibst du dann mittels return wieder an die nächsthöhere zurück - und lässt es dort direkt in ein schwarzes Loch fallen.
                    I don't believe in rebirth. Actually, I never did in my whole lives.

                    Kommentar


                    • #11
                      Wie sieht $var aus beim ersten Aufruf aus?

                      Und räum mal bisschen auf! $i wird nicht benutzt. isset($foo) ist überflüssig in einem If-Block, der nur genau dann betreten wird. Der Parameter $sub leitet sich direkt aus $var ab, kann also weg.

                      Damit du verstehst was wir meinen, kommentiere mal die Zeile gallist($val["SUB"], $depth+1, $cnt, $anzahl); aus. Wirst sehen, dass du dann genau das selbe zurück bekommst. Danach kommentiere sie mal wieder ein und setze $g_out = davor. Vielleicht klappt es dann schon.
                      Zuletzt geändert von onemorenerd; 21.06.2009, 13:18.

                      Kommentar


                      • #12
                        Ich muss gestehen ihr hattet wie immer recht!
                        Binaries über mein Haupt!

                        Wenn mir jetzt noch jmd das Brett vorm Kopf wegnehmen könnte, das verhindert, dass die Struktur im Array gleich bleibt, selbst wenn es sich um nen rekursiven Aufruf handelt, wäre ich sehr verbunden!
                        Es ist nämlich so, daß rekursive Aufrufe einen Index mehr im Array haben!

                        PHP-Code:
                        function gallist($var$depth=0, &$cnt=0$sub=0) {
                            
                        $g_out = array();
                            FOREACH (
                        $var as $val) {
                                
                        $rueck $depth 16;
                                
                        // Class ändern wenn subgallery
                                
                        IF (!isset($val["SUB"])) {
                                  
                        $class "normal";
                                } ELSE {
                                  
                        $class "bold";
                                }
                                
                        // Array $g_out befüllen
                                
                        $g_out[$cnt] = array('key' => $cnt'id' => $val[0]["id"], 'name' => $val[0]["name"], 'depth' => $rueck'class' => $class);
                                IF (isset(
                        $val["SUB"])) {
                                    
                        $cnt++;
                                    
                        $anzahl = isset($val["SUB"]) ? count($val["SUB"]) : 0;
                                    
                        $g_out[$cnt] = gallist($val["SUB"], $depth+1$cnt$anzahl);
                                }
                                
                        $cnt++;
                            }
                            return 
                        $g_out;

                        Normal aufgerufen:
                        [0] Array ( [id] => 56 [name] => Zusätzliches [depth] => 0 [class] => normal )

                        Rekursiv aufgerufen:
                        [1] Array ( [1] => Array ( [id] => 57 [name] => Kreativwerkstatt [depth] => 16 [class] => bold ) [2] => Array ( [id] => 58 [name] => Fitnesscenter [depth] => 16 [class] => bold ) [3] => Array ( [id] => 173 [name] => Diverses [depth] => 16 [class] => bold ) [4] => Array ( [id] => 189 [name] => Logos [depth] => 16 [class] => normal ) [6] => Array ( [5] => Array ( [id] => 193 [name] => © Pfeiffer [depth] => 32 [class] => bold ) ) )

                        Ich denk mal daß ich da um ein array_merge nicht drum rum komme, oder!?

                        Edit:
                        Weder mit array_merge(), noch mit array_push() bekomme ich ein brauchbares Ergebniss!
                        PLS HELP!

                        Edit2:
                        Problem nach wie vor nicht gelöst! Ich hab nach wie vor bei rekursiven Aufrufen eine Dimension mehr im Array....
                        Bin weiterhin für jede Hilfe dankbar!
                        Zuletzt geändert von nichtsooft; 22.06.2009, 14:37.
                        WHILE (!$asleep) { $sheep++; }

                        Kommentar


                        • #13
                          SRY Wegen Doppelpost!

                          PHP-Code:
                          function gallist($var$depth=0, &$cnt=0$sub=0$g_out) {
                              
                          $set 0;
                              FOREACH (
                          $var as $val) {
                                  
                          $rueck $depth 16;
                                  
                          // Class ändern wenn subgallery
                                  
                          IF (!isset($val["SUB"])) {
                                    
                          $class "normal";
                                  } ELSE {
                                    
                          $class "bold";
                                  }
                                  
                          // Array $g_out befüllen
                                  
                          $g_out[$cnt] = array('key' => $cnt'id' => $val[0]["id"], 'name' => $val[0]["name"], 'depth' => $rueck'class' => $class);
                                  IF (isset(
                          $val["SUB"])) {
                                      
                          $cnt++;
                                      
                          //$g_out = array();
                                      
                          $anzahl = isset($val["SUB"]) ? count($val["SUB"]) : 0;
                                      
                          $g_out[$cnt] = gallist($val["SUB"], $depth+1$cnt$anzahl$g_out);
                                  } ELSE {
                                      
                          $set 1;
                                  }
                                  IF(
                          $set === 1) {return $g_out;};
                              }
                              return 
                          $g_out;

                          Ich bin nun so weit, daß ich beim Funktionsaufruf ein Array mitgebe und mit der Funktion selbst versuche es zu befüllen!
                          Leider klappt das auch nicht!
                          Wäre bitte jmd so nett und würde mir sagen, wo mein Fehler liegt!? Wahsaga, Peter K., oder einer der Spezialisten!?
                          Zuletzt geändert von nichtsooft; 24.06.2009, 09:32.
                          WHILE (!$asleep) { $sheep++; }

                          Kommentar


                          • #14
                            Weder mit array_merge(), ..... bekomme ich ein brauchbares Ergebniss!
                            Aha!
                            Und was ist falsch am Ergebnis?
                            Wir werden alle sterben

                            Kommentar


                            • #15
                              Nunja ich will ja ein Array in der Form ('key','id','name','depth','class') und bekomm' mit der aktuellen Form in etwa soetwas zurück:
                              Array ( [0] => Array ( [key] => 0 [id] => 56 [name] => Zusätzliches [depth] => 0 [class] => bold ) [1] => Array ( [0] => Array ( [key] => 0 [id] => 56 [name] => Zusätzliches [depth] => 0 [class] => bold ) [1] => Array ( [key] => 1 [id] => 57 [name] => Kreativwerkstatt [depth] => 16 [class] => normal ) ) )

                              Sprich erstens werden nicht alle Werte ins Array geschrieben und zweitens bleibt die Struktur ned erhalten, weil wenn isset($val["SUB"]) wieder eine Dimension mehr in meinem Array drinnen ist als ich wollte!

                              Was genau bei meinen Versuchen mit "array_merge()" zurückgegeben wurde weiß ich nicht mehr. Da es nicht geklappt hab, hatte ich den Versuch - genau wie auch bei array_push() - verworfen! ^^
                              WHILE (!$asleep) { $sheep++; }

                              Kommentar

                              Lädt...
                              X