Rekursion - HILFE

dwex

Erfahrenes Mitglied
Hallo Leute,

ich bin gerade so ziemlich am verzweiflen weil ich eine (meine erste) rekursive Funktion brauche und es nicht so tut wie ich will.

Was brauche ich:
Ich benötige eine Funktion welche mir ausgehend von einer bestimmten Kategorie - alle Elternkategorien als Array zurück liefert.

Meine Datenbank sieht (vereinfacht) so aus:
|-------------------|-------------|
| categories_id | parent_id |
|-------------------|-------------|
| 23 | 0 |
| 24 | 0 |
| 25 | 0 |
| 26 | 23 |
| 27 | 24 |
| 28 | 0 |
| 29 | 27 |
|-------------------|-------------|

Dazu habe ich folgende Funktion:
PHP:
function get_tree($who,$ebene) {
 $res=mysql_query ("select * from `categories` where `categories_id`=$who;");
 
 if($daten == false) {
 	$daten_array = array();
 }
 
 
  while ($verwandter=mysql_fetch_array($res)) {
    echo $ebene = $verwandter[categories_id].",";
    get_tree($verwandter[parent_id],$ebene);
  }
  
  
}
welche ich mit
PHP:
get_tree(29, "");
aufrufe.

Die Ausgabe ist dabei
Code:
29,27,24,

Jetzt habe ich die Funktion mal umgeschrieben, sodass mir diese ein Array mit allen relevanten ID´s zurückgeben müsste.
PHP:
function get_tree($who,$ebene,$daten=false) {
 $res=mysql_query ("select * from `categories` where `categories_id`=$who;");
 
 if($daten == false) {
 	$daten_array = array();
 }
 
 
  while ($verwandter=mysql_fetch_array($res)) {
    $ebene = $verwandter[categories_id].",";
    
    $daten_array[] = $verwandter[categories_id];
    
    
    if($verwandter[parent_id] == 0) {
    	return $daten_array;
    }
    
    get_tree($verwandter[parent_id],$ebene, $daten_array);
  }
  

  
  
  
}
Dieses rufe ich dann einfach zum testen mit
PHP:
print_r(get_tree(29, ""));
auf.

Dort bekomme ich jedoch keine Ausgabe mehr.

Kann mir bitte jemand weiterhelfen wo mein Denkfehler liegt?
Vielen Dank für euer Bemühungen im Voraus!
 
Zuletzt bearbeitet:
Vielen Dank für den Link.

Eine Frage hätte ich noch - wie muss das SQL-Statement denn aussehen wenn ich die zwangsläufige 0 am Ende nicht haben möchte?

Außerdem ist mir aufgefallen, das das Ergebniss immer ein Array enthält. Kann man das auch so ausgeben das es den "Echtwert" ohne Array enthält?

Und zu guter letzt würde mich noch interessieren was es mit dem := in deinem Query aufsich hat - das habe ich noch nie gesehen.
 
Zuletzt bearbeitet:
Das := ist eine Zuweisung für eine Variable (Die Namen die mit @ beginnen sind Variablen)

Keine 0:
Am Ende einfach noch ein WHERE hinzufügen
SQL:
...
            @id IS NOT NULL
    ) AS dat
WHERE
	id <> 0

Was meinst du mit dem Echtwert? Und wie soll das Resultat genau aussehen?
 
Wenn ich die Abfrage in PHPMyAdmin eingebe - dann bekomme ich als Ergebnis BLOB-Werte zurück geliefert.
Das hat mich anfangs ein bischen verwirrt.
Dann habe ich das ganze mal in meine PHP-Umgebung eingebaut und festgestellt, dass dein SQL-Statement ein verschachteltes Array zurückliefert.
Mit Echtwert meinte ich, ob es möglich ist das verschachtelte Array in eine nicht verschachteltem Array zurückzugeben - wie es eben kommt wenn man "normale" Werte aus ein SQL-Statement mit einer Schleife ausgibt.

Danke für die weitere WHERE-Klausel
 
****? Bring mal ein var_dump() des Resultates.

Nachtrag:
Ich habe mal folgenden Test gemacht:
PHP:
$sql = <<<SQL
SELECT
    id
FROM
    (
        SELECT  
                -- Die letzte ParentID als ID ausgeben
            @id AS id,
            -- Die nächste ParentID ermitteln
            @id := IF(@id IS NOT NULL, (SELECT parentID FROM nav WHERE id = @id), NULL) AS parentID
        FROM
            nav,
            -- Die Variablen initialisieren
            -- TODO: Hier anstelle der 9 deine Start-ID setzen
            (SELECT @id := 9) AS vars
        WHERE
            @id IS NOT NULL
    ) AS dat;
SQL;
$result = mysql_query($sql);
while($row = mysql_fetch_assoc($result)){
    echo "{$row['id']}<br />";
}
Und das ist das Resultat
HTML:
9<br />10<br />8<br />2<br />1<br />

es funktioniert bei mir also genauso wie normal.
 
Zurück