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

时间:2014-12-02 16:40:13

标签: php recursion nested

我在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告诉我们递归函数的嵌套级别,但它不是......它只计算调用次数。我希望很明显,我想知道每个子元素的“代”。

1 个答案:

答案 0 :(得分:1)

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