Kreuzabfragen mit mehreren Hirarchien

PHP:
function categories ($categories_id, $string) {

    $abfrage = mysql_query("SELECT * FROM `categories` WHERE `categories_id` = '$categories_id' LIMIT 1");
    
    if(!@mysql_num_rows($abfrage)) {
    	return "nichts gefunden";
    }
    
    $row = mysql_fetch_array($abfrage);
    
    if($row['parent_id'] == 0) {
    	return $string.$row['categories_id'];
    } else {
    	$string .= $row['categories_id'];
    	categories($row['parent_id'], $string);
    }
    
}

Je tiefer ihr geht umso mehr Schachteln sind um die Funktion herum. Der String wird immer Erweitert, dass stimmt. Aber wenn ihr euer Geschenk (der String) in knapp 5 Boxen eingepackt habt und kein Fenster (return) in den Paketen ist, wie wollt ihr dann wissen was drin steckt?

Beachtet doch nur mal den vorletzten Aufruf:
- categories(25, "1022");
- Parent ist 0, also return 102225;
Wohin geht das return? An die nächst höhere Schachtel.
Was macht die? Nichts! Sie leitet es nicht weiter an alle höheren Schachteln.
Warum? Weil dort vorher nur steht: categories($row['parent_id'], $string);
Kein return, kein echo, garnichts.

PS: Ja es geht auch ohne einen zusätzlichen Parameter. Beispiel:
PHP:
// eine Art Countdown, dürfte das ergeben

// mit Zusatz
function ZaehleZusatz($zahl, $string)
{
  // Abbruchbedingung
  if ($zahl < 0) return $string;

  // Rekursion
  $string = $zahl . $string;
  return ZaehleZusatz($zahl - 1, $string);
}

// ohne
function Zaehle($zahl)
{
  // Abbruchbedingung
  if ($zahl < 0) return "";

  // Rekursion
  return $zahl . Zaehle($zahl - 1);
}
 
Zuletzt bearbeitet:
Ah ok, jetzt bin ich dahinter gestiegen, danke ;-)
An die Tatsache, dass die "letzte" Funktion nicht direkt zurückgeben kann, hatte ich gar nicht gedacht.
 
Jetzt wirds leichter.

Also return ist nicht gleich zu setzen mit "beende das und mach im normalen Quelltext weiter" - sondern return ruft selbst erst die "einge" Funktion wieder "von vorne" auf.

Jetzt ist es klar!
Vielen Dank nochmals an euch beide!
 
Zuletzt bearbeitet:
Zurück