2014-12-02 81 views
0

我有一個從數據庫中獲取文件夾樹的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(); 

我想到的是,變量$縮進告訴我們遞歸函數的嵌套結構的水平,但它不是..它只是計算的呼叫數量。我希望很清楚,我想知道每個孩子元素的「一代」。

回答

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