screamfine Geschrieben 2. Februar 2005 Teilen Geschrieben 2. Februar 2005 Hallo zusammen! Ich habe eine rekursive Funktion geschrieben, die mir lediglich einen Pfad ausgeben soll. Das Problem was ich habe, ist, dass ich beim Return des Arrays statt dem vollständigen Array nur einen Bruchteil davon erhalte. Hier erstmal die Funktion: config.php | PHP-Quellcode: <?php function dlpath($cid,$i,$ar) { global $_tbldownloadcat; $sql = "SELECT idx,title,subcat FROM $_tbldownloadcat"; $sql .= " WHERE idx = '$cid'"; $res = mysql_query($sql); if (mysql_num_rows($res)>0) { while(list($idx,$title,$subcat)=mysql_fetch_row($res)) { if(!is_array($ar)) $ar=array(); array_push($ar,"$title"); $i++; dlpath($subcat,$i,$ar); } } else { if(is_array($ar)) { $ar=array_reverse($ar); print_r($ar); // zum Test hier eine Ausgabe (#1) } else { return false; } } return $ar; } ?>[/PHP] Wie man siehst habe ich innerhalb der Funktion einfach mal print_r($ar) gemacht, um sicher sein zu können, dass das Array bis dorthin in Ordnung und richtig befüllt ist, sogar schon in der richtigen Reihenfolge. Die Ausgabe (#1) zeigt: Array ( [0] => Tools [1] => Freeware ) Das ist korrekt so. Jetzt kommt der mir unverständliche Teil. Wenn ich den return setze (return ist eben der Array) und im Hauptprogramm die Funktion aufrufe, sieht das so aus (Ausgabe #2): Array ( [0] => Freeware ) Er "verschluckt" irgendwie nen Wert ?! Zum besseren Verständnis habe ich hier noch den Teil des Hauptscriptes, in dem die Funktion aufgerufen wird, kopiert: main.php | PHP-Quellcode: [PHP]<?php // ... $pid ist zu Beginn = '0' $ret=dlpath($pid,0,0); print_r($ret); // Ausgabe #2 ?> Hat jemand eine Idee wieso das nicht klappt? Der Grund warum ich überhaupt mit Arrays hier arbeite, ist, weil ich ansonsten den Pfad zwar herausbekomme, ABER nicht in der richtigen Reihenfolge, also statt "Tools > Freeware" würde ich das hier erhalten: "Freeware > Tools". Danke euch für jeden Tipp! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
etreu Geschrieben 2. Februar 2005 Teilen Geschrieben 2. Februar 2005 Du rufst zwar die Funktion rekursiv auf, aber du speicherst das Ergebnis nicht ab. Beim letzten Fall, wo der else-Zweig durchlaufen wird, erzeugt er die richtige Ausgabe. Nach dem Return ist das Ergebnis verloren, da dich im if-Zweig befindest die Rückgabe von deiner Funktion ignorierst: while(list($idx,$title,$subcat)=mysql_fetch_row($r es)) { if(!is_array($ar)) $ar=array(); array_push($ar,"$title"); $i++; dlpath($subcat,$i,$ar); // Hier ist der Fehler !!! $ar = dlpath($subcat,$i,$ar); // so ist er weg } [/PHP] Das sagt mir zumindest meine Logik. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
screamfine Geschrieben 2. Februar 2005 Autor Teilen Geschrieben 2. Februar 2005 hm... und was genau müsste ich ändern?! Ich sehe vor lauter Bäumen den Wald nicht mehr ... Ich habe mal direkt vor das return den print_r($ar) Befehl gesetzt. Jetzt wird das hier angezeigt: Array ( [0] => Tools [1] => Subkategorie1 ) Array ( [0] => Subkategorie1 [1] => Tools ) Array ( [0] => Subkategorie1 ) Array ( [0] => Subkategorie1 ) :confused: :confused: EDIT: sry! hab's eben gesehen, du hast ja meine funktion schon verbessert. werd's gleich ausprobieren!!!!! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
screamfine Geschrieben 2. Februar 2005 Autor Teilen Geschrieben 2. Februar 2005 Ok, geil!, danke erstmal, das war tatsächlich der Fehler. Unlogisch ist mir jetzt zwar immer noch warum der 4x das ganze durchläuft ... aber ok. dann noch eine wichtige frage: ich hab jetzt den array - würde nun gerne mit foreach oder sonst irgendwie die Werte wieder aus dem Array ziehen und in einen String schreiben, so dass das so aussieht: "Tool --> Subkat --> Subkat2" .... Ich hab's versucht in der Funktion direkt nachdem ich den array_reverse Befehl mache, das foreach einzubauen .... leider ohne Erfolg. Ich erhalte keine Werte ... Ich möchte es aber schon irgendwie in dieser Funktion hinbekommen, so dass ich den fertigen String via return ans Hauptscript zurückgeben kann und diesen dort ohne wenn und aber direkt ausgeben kann. foreach($ar as $val) { $container.="$val -->"; } .... hat in der Funktion nach dem array_reverse leider nicht funktioniert.... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
etreu Geschrieben 3. Februar 2005 Teilen Geschrieben 3. Februar 2005 Mit implode($trenner, $array) kanst die Inhalte eines arrays zu einem String zusammenfügen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.