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



我在php中有一个递归函数,它从数据库中获取文件夹树。每个文件夹都有一个 ID、一个名称和一个父 ID。

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告诉我们递归函数的嵌套级别,但事实并非如此......它只是计算调用次数。我希望很清楚,我想知道每个子元素的"世代"。

尝试将$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>';
    }
}

最新更新