【问题标题】:Does this code create multiple instances of the function?此代码是否创建函数的多个实例?
【发布时间】:2013-03-09 23:54:35
【问题描述】:

我正在学习如何构建父/子类别列表。我找到了一个很棒的教程并实现了以下代码:

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>';
    }
}

我难以理解的是 PHP 如何处理 foreach 和递归函数。

这似乎会导致多个“实例??”函数和 foreach 循环同时运行...对吗?

如果这是正在发生的事情,那么随着我的列表增长和孩子关系的加深,这似乎可能会放缓。这是真的吗?

【问题讨论】:

  • 对于树元素的循环和/或打印,最好的方法是递归,递归是编程中接受的方法。
  • 忘记函数的“实例”吧,没有这样的东西。当你调用一个函数时,函数中列出的步骤将被执行。这可以递归地发生,当指示这样做时执行这些步骤。发生在已经执行的非常相似的步骤(相同的功能)的中间并不重要。

标签: php memory tree recursive-datastructures


【解决方案1】:

简短的版本是该功能以这种方式工作:

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)

并不是同时创建函数的多个版本,它们是按顺序进行的扩展和收缩,但它们都源于原始函数调用。

【讨论】:

  • 膨胀和收缩的解释真的帮助我理解它。谢谢!!
猜你喜欢
  • 2021-12-25
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 2021-04-30
  • 2013-03-04
相关资源
最近更新 更多