2009-04-17 9 views
1

Ich habe diese Funktion, der wesentlichen Operationen werden wie folgt beschrieben:Optimierung eine nicht-tail-rekursive Funktion

function render($index) { 
    foreach($things[$index] as $key => $data) { 
     echo '<div>'; 
     /* irrelevant operations */ 
     if(isset($data['id'])) { 
      echo '<div class="wrap">'; 
      render($things[$data['id']]); 
      echo '</div>'; 
     } 
     echo '</div>'; 
    } 
} 

Ich kann mich nicht für das Leben herauszufinden, wie diese Funktion zu optimieren; Ich befürchte, dass PHP implodiert, wenn der Call-Stack zu groß wird.

Gibt es eine Möglichkeit, diese Funktion zu optimieren?

+0

Ich bin verwirrt. Also alles, was Sie jemals ausdrucken, sind verschachtelte Divs? Oder lässt du einen Teil der Funktion aus? So oder so, das sieht für mich ziemlich optimiert aus. Ich sehe keine Abkürzungen für das, was Sie erreichen wollen. –

Antwort

3

Dieser Code ist nicht getestet, aber von der Oberseite meines Kopfes, sollte die iterative Funktion wie folgt aussehen:

function render($index){ 
    $stack = array(); 
    array_push($index); 

    $pre = ''; 
    $post = ''; 

    while(!empty($stack)){ 
     $idx = array_pop($stack); 

     foreach($things[$idx] as $key => $value){ 
      $pre .= '<1>'; 
      $spost = ''; 

      if(isset($data['id'])){ 
       $pre .= '<2 class="wrap">'; 
       $spost .= '</2>'; 

       $stack[] = $things[$data['id']]; 
      } 

      $spost .= '</1>'; 
      $post .= $spost; 
     } 
    } 

    return $pre . $post; 
} 
3

Was Sie tun, ist effektiv einen Baum zu überqueren. Grundsätzlich ist das nicht schlechter als alle Werte in einem Baum zu drucken. Haben Sie irgendwelche besonderen Probleme damit erlebt, dass sie zu groß wurden? Wie tief verschachtelt ist dieser Baum?

9

Es ist höchst zweifelhaft, dass Sie sich Sorgen machen müssen. Wenn Sie divs so tief verschachteln, dass der Aufruf-Stack voll ist, ist die Rekursionstiefe die geringste Ihrer Sorgen.

3

Sie müssen KEINE Rekursion verwenden, um eine Tiefenüberquerung Ihres Baums durchzuführen; Es funktioniert einfach sehr gut. Wenn Sie sich Sorgen um Ihren Stack machen, können Sie einfach eine lange Schleife auf alle Ihre Elemente legen, die nur die letzte und aktuelle Position enthalten. Rekursion ist ein einfacherer und (im Allgemeinen) besserer Weg, um das Tiefen-zuerst-Traversieren durchzuführen.