2013-09-05 25 views
9

Ich möchte nur sicherstellen, dass ich es richtig mache, und dies wird keine Konflikte erstellen.Rekursive Funktion: Call php Funktion selbst

Ich habe eine Funktion, die sich selbst aufruft und Ihre Zustimmung braucht, wenn es OK ist oder nicht?

<?php 

function determine($the_array){ 
    foreach ($the_array as $key => $value) { 
     switch ($key) { 
      case 'in': 
        echo $value; 
       break; 

      case 'out': 
        echo $value; 
       break; 

      case 'level': 
        echo '<ul>'; 
        determine($value); 
        echo '</ul>'; 
       break; 

     } 
    } 

} 

Dies ist das Array:

$the_array = array(
    'in' => '<li>Simple IN</li>', 
    'out' => '<li>Simple OUT</li>', 
    'level' => array(
      'in' => '<li>Simple IN 2</li>', 
      'out' => '<li>Simple OUT 2</li>', 
      'level' => array(
       'in' => '<li>Simple IN 3</li>', 
       'out' => '<li>Simple OUT 3</li>' 
      ), 
     ), 
); 

Und hier ist der letzte init:

echo '<ul>'; 
determine($the_array); 
echo '</ul>'; 

Das Ergebnis ist nur, wie ich sein wollte, es funktioniert großartig, aber ich don Ich weiß nicht, ob das eine gute Praxis ist.

Antwort

26

Rekursive Funktionen sind in Ordnung - aber gefährlich, wenn Sie nicht sicher sind, was Sie tun. Wenn es eine Chance gibt, dass eine Funktion in einer rekursiven Schleife endet (wo sie sich immer wieder selbst aufruft), wirst du entweder aushelfen, keinen Speicher mehr haben oder eine Zombie-Apokalypse verursachen.

Denken Sie an rekursive Anrufe als ein wirklich, wirklich scharfes Messer - in den Händen eines erfahrenen Kochs, es ist ein Spiel im Himmel, in den Händen der Spülmaschine, es ist ein verlorener Finger, der darauf wartet, zu passieren.

PHP versucht, nett zu spielen, und begrenzt eine rekursive Tiefe standardmäßig auf 100 (obwohl dies geändert werden kann), aber für fast alle Fälle, wenn Ihre rekursive Tiefe 100 erreicht, ist der Unfall bereits passiert und PHP reagiert durch Stoppen irgendwelche zusätzlichen Fußgänger, die in den Verkehr wandern. :)

+2

Oder kürzer: rekursive Funktionen sind keine schlechte Praxis. :) – Virus721

+1

@ Virus721 Ja und nein, wenn Sie nicht wissen, was Sie tun, sind sie eine schlechte Praxis :) – Fluffeh

+1

Die schlechte Praxis in diesem Fall ist nicht zu wissen, was Sie tun, nicht mit einem rekursive Funktion. – Virus721

3

Flufeh lieferte ausreichende Antwort, soweit rekursive Funktionen betroffen sind. Wenn Sie jedoch die Rekursion mit großen Arrays/Objekten/etc verwenden, sollten Sie sich die Optimierung Ihres Codes ansehen, damit nicht viel Speicher oder CPU-Leistung für die Ausführung benötigt wird.

Sie könnten Ihren Code einfach optimieren, um sauberer zu sein, weniger Speicher zu benötigen und robuster gegenüber unerwarteten Daten zu sein. Beachten Sie die & in der Liste Funktionsargumente (es beseitigt das Erstellen einer Kopie eines Arrays jedes Mal, wenn eine geschachtelte Funktion aufgerufen wird).

function determine(& $the_array){ 
foreach ($the_array as $key => $value) { 
    switch ($key) { 
     case 'in': 
     case 'out': 
       echo $value; 
      break; 

     case 'level': 
      if (!is_array($value)) break; 
       echo '<ul>'; 
       determine($value); 
       echo '</ul>'; 
      break; 

     } 
    } 
} 
0

Ich denke, wenn Sie Tiefe Array wissen, ist es gut

$list = ""; 
foreach ($the_array as $array) { 
    if(is_array($array)) { 
     foreach($array as $sub_array) { 
      if(is_array($sub_array)) { 
       foreach($sub_array as $sub_array_2) { 
        $list .= "$sub_array_2"; 
       } 
      } else { 
      $list .= "$sub_array"; 
      } 
     } 
    } else { 
     $list .= "$array"; 
    } 
} 

echo "<ul>$list</ul>"; 
1

Ich weiß nicht, zu verwenden, wenn es eine gute Lösung ist, aber ich benutze dieses von innen selbst eine Funktion aufzurufen:

function my_calucar(){ 
    $arrayy= array('mine' => '1', 'yours' => '24', 'her' => '34'); 
    foreach ($arrayy as $each=>$value) { 
     switch ($each) { 
     default: 
       my_calucar($value); 
     } 
    } 
}