Wenn man aber einfach z.B. folgenden Code ausführt:
PHP:
function foo()
{
foo();
}
foo();
Die Funktion hat in ihrem Code einen Aufruf zu sich selbst. Man spricht von
Rekursion
Das obige Beispiel hat aber einen Nachteil: Es wird eine Endlos-Schleife geben und entweder die max_execution_time erreicht, oder der Webserver
wird abstürzen. In beiden Fällen jedenfalls ein Performanceverlust.
Was man braucht ist daher eine Abbruchbedingung.
Das kann man z.B. mit einem Counter machen:
PHP:
function foo( $a_iCount )
{
if ($a_iCount > 0) {
foo( $a_iCount - 1);
}
}
foo(4);
Erklärung: Der Funktion
foo wird eine Zahl übergeben. Nun wird geprüft,
ob die Zahl größer null ist und, wenn ja, die Funktion noch ein mal aufgerufen.
Diesmal wird die
Zahl - 1 übergeben.
D.h. im Klartext: irgendwann wird die Zahl einen Wert von null haben und die
Funktion hört auf sich selber auf zu rufen. Die Funktion wurde nun eine
bestimmte Anzahl mal aufgerufen.
Die beiden obigen Beispiele haben allerdings eines gemeinsam: Sie
machen nichts.
Ein konkretes Beispiel wäre z.B. folgendes:
Es wird ein Array definiert, welches mittels Rekursion vollständig ausgegeben
werden soll.
Dazu übergeben wird der Funktion das Array und die Länge des Arrays.
Innerhalb der Funktion wird die übergebene Länge dann allerdings nicht
mehr als Länge benutzt, sondern als aktuelle Position im Array, sprich
welches Element als nächstes ausgegeben werden soll.
Der Code:
PHP:
function foo( $a_iPos, $a_aArray )
{
if ($a_iPos > 0) {
echo $a_aArray[$a_iPos]."<br>\r\n";
foo( $a_iPos - 1 );
}
}
$aBar = array( 10, 21, 43, 12, 43);
foo( count($aBar) - 1, $aBar);
Q: Warum wird
count($aBar) - 1 und nicht nur
count($aBar) übergeben?
A: Weil er direkt das Element ausgibt, dessen Index wird übergeben haben,
und da
count($aBar) zwar die Anzahl der Elemente im Array zurückgibt,
aber die Array-Zählung bei null beginnt muss man logischerweise die
Länge - 1 übergeben.
Q: Wieso wird das Array rückwärts ausgegeben?
A: Weil man mit
count($aBar) - 1 zuerst das letzte Element anspricht.
Wenn man es nicht will, kann man die Funktion auch so aufrufen:
PHP:
foo(count($aBar) - 1, array_reveres($aBar))
hth