2013-03-09 40 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

相关问题