PHP如何计算递归函数中的嵌套调用级别?

问题描述:

我有一个从数据库中获取文件夹树的PHP递归函数。每个文件夹都有一个ID,一个名称和一个父ID。PHP如何计算递归函数中的嵌套调用级别?

function show_subfolders($parent=0, $indent=0) { 
    $indent++; 
    $folders = sql_to_assoc("SELECT * FROM `folders` WHERE 'parent' = ".$parent.";"); 
    foreach($folders as $folder) { 
     echo ' <a href="filebrowser.php?parent='.$folder['id'].'"> '.$folder['naam'].' </a><br>'; 
     show_subfolders($folder['id'], $indent); 
    } 
} 

show_subfolders(); 

我想到的是,变量$缩进告诉我们递归函数的嵌套结构的水平,但它不是..它只是计算的呼叫数量。我希望很清楚,我想知道每个孩子元素的“一代”。

尝试在函数作用域之外获取$ indent var,并且在结束遍历节点(文件夹)内容后,您将返回一个级别,因此在某个时候您应该执行$ indent--;

$indent = 0; 

function show_subfolders(){ 
    // give this function access to $indent 
    //you could also use a class var $this->indent if you make this into a class method 
    global $indent; 

    $folders = sql_to_assoc("SELECT * FROM `folders` WHERE 'parent' = ".$parent.";"); 
    foreach($folders as $folder) { 
     echo str_repeat ('&nbsp;', $indent).' <a href="filebrowser.php?parent='.$folder['id'].'"> '.$folder['naam'].' </a><br>'; 
     $indent++; 
     show_subfolders($folder['id']); 
     $indent--; 
    } 
} 

还添加了str_repeat函数,以便您的链接在浏览器中呈现时“缩进”。虽然更好的方法是绘制链接,这将允许您使用css控制视觉缩进。这将使它:

$indent = 0; 

function show_subfolders(){ 
    // give this function access to $indent 
    //you could also use a class var $this->indent if you make this into a class method 
    global $indent; 

    $folders = sql_to_assoc("SELECT * FROM `folders` WHERE 'parent' = ".$parent.";"); 
    if (count($folders)){ 
     echo '<ul>'; 
     foreach($folders as $folder) { 
      echo '<li><a href="filebrowser.php?parent='.$folder['id'].'"> '.$folder['naam'].' </a></li>'; 
      $indent++; 
      show_subfolders($folder['id']); 
      $indent--; 
     } 
     echo '</ul>'; 
    } 
}