Zum Inhalt springen

Rekursive Funktion und ein fehlerhafter Return ...


Empfohlene Beiträge

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!!!!!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...