2013-03-09 45 views
1

我正在學習如何構建父/子類別列表。我發現了一個偉大的教程,並已實現了以下代碼:此代碼是否創建該函數的多個實例?

while($row = $tree_sth->fetch()){ 
    $rows[$row['id']] = array('name'=>$row['name'], 'on'=>$row['on'], 'parent'=>$row['parent']); 
} 

function btree($parent){ 

    $has_childs = false; 
    global $rows; 

    foreach ($rows as $key => $value){ 
     if($value['parent'] == $parent){ 
      if ($has_childs === false){ 
       $has_childs = true; 
       echo '<ul>'; 
      } 
      echo '<li>'.$value['name']; 
      btree($key); 
      echo '</li>'; 
     } 
    } 
    if($has_childs === true){ 
     echo'</ul>'; 
    } 
} 

什麼我無法理解的是如何在foreach和遞歸函數由PHP處理。

看來,這會導致多個「實例??」的函數和foreach循環同時運行...是否正確?

如果這是發生的事情,看起來這可能會減慢,因爲我的名單增長和子女關係變得更深。這是真的?

+1

對於循環樹元素和/或打印它們,最好的方法是遞歸,並且遞歸在編程中是可接受的方法。 – 2013-03-10 00:02:56

+1

忘記一個函數的「實例」,沒有這樣的事情。當您調用函數時,函數中列出的步驟將被執行。這可以遞歸地發生,這些步驟在被指示時執行。無關緊要的是,這種情況發生在已經被執行的非常類似的步驟(相同的功能)中。 – deceze 2013-03-10 00:06:27

回答

2

短,短版是功能被以這種方式工作:

Begin-function (first instance): 
    Begin-loop: 
      Loop... 
      Begin-func-again? 

       Begin-function (second instance): 
        Begin-loop: 
         Loop... 
         Begin-func-again? 

          Begin-function (third instance): 
            Begin-loop: 
             Loop... 
             Begin-func-again? (NO) 
              // termination point reached 
            End-loop 
          End-function (third instance) 

        End-loop (from second instance) 
       End-function (second instance) 

    End-loop (from first instance) 
End-function(first instance) 

這並不是說有功能的多個版本同時被創建,它們是一個膨脹和收縮,從而完成,但它們都是源於原始函數調用。

+0

擴展和收縮的解釋確實幫助我解開它。謝謝!! – 2013-03-10 00:22:37

相關問題