Problem - Rekursive Funktion + return

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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
    Originally posted by nichtsooft View Post
    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(...);

    Comment


    • #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++; }

      Comment


      • #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.

        Comment


        • #5
          Originally posted by wahsaga View Post
          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...
          Last edited by nichtsooft; 21-06-2009, 11:44.
          WHILE (!$asleep) { $sheep++; }

          Comment


          • #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.
            Last edited by combie; 21-06-2009, 11:48.
            Wir werden alle sterben

            Comment


            • #7
              Originally posted by combie View Post
              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...

              Originally posted by combie View Post
              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!
              Last edited by nichtsooft; 21-06-2009, 11:51.
              WHILE (!$asleep) { $sheep++; }

              Comment


              • #8
                Originally posted by nichtsooft View Post
                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.

                Comment


                • #9
                  Originally posted by wahsaga View Post
                  ...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 )


                  Originally posted by wahsaga View Post
                  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!?
                  Last edited by nichtsooft; 21-06-2009, 12:01.
                  WHILE (!$asleep) { $sheep++; }

                  Comment


                  • #10
                    Originally posted by nichtsooft View Post
                    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.

                    Comment


                    • #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.
                      Last edited by onemorenerd; 21-06-2009, 12:18.

                      Comment


                      • #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!
                        Last edited by nichtsooft; 22-06-2009, 13:37.
                        WHILE (!$asleep) { $sheep++; }

                        Comment


                        • #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!?
                          Last edited by nichtsooft; 24-06-2009, 08:32.
                          WHILE (!$asleep) { $sheep++; }

                          Comment


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

                            Comment


                            • #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++; }

                              Comment

                              Working...
                              X