2010-06-23 78 views
2

我想使用scandir顯示在特定目錄(工作正常)中列出的文件夾的選擇列表,但是,我需要它也將子文件夾(如果有的話)添加到我的選擇列表中。如果有人能幫助我,那會很棒!使用PHP創建文件夾選擇列表 - 包括子文件夾?

這是我想要的結構:

<option>folder 1</option> 
<option> --child 1</option> 
<option> folder 2</option> 
<option> folder 3</option> 
<option> --child 1</option> 
<option> --child 2</option> 
<option> --child 3</option> 

這是代碼我有(這隻能說明父文件夾)這是我從這個線程獲得(Using scandir() to find folders in a directory (PHP)):

$dir = $_SERVER['DOCUMENT_ROOT']."\\folder\\"; 

$path = $dir; 
$results = scandir($path); 

$folders = array(); 
foreach ($results as $result) { 
    if ($result == '.' || $result == '..') continue; 
    if (is_dir($path . '/' . $result)) { 
     $folders[] = $result; 
    }; 
}; 

^^但我需要它也顯示子目錄..如果有人可以幫助,那會很棒! :)

編輯:忘了說,我不想要的文件,只有文件夾..

+0

遞歸遍歷它們。 – Andrey 2010-06-23 01:40:28

回答

2
/* FUNCTION: showDir 
* DESCRIPTION: Creates a list options from all files, folders, and recursivly 
*  found files and subfolders. Echos all the options as they are retrieved 
* EXAMPLE: showDir(".") */ 
function showDir($dir , $subdir = 0) { 
    if (!is_dir($dir)) { return false; } 

    $scan = scandir($dir); 

    foreach($scan as $key => $val) { 
     if ($val[0] == ".") { continue; } 

     if (is_dir($dir . "/" . $val)) { 
      echo "<option>" . str_repeat("--", $subdir) . $val . "</option>\n"; 

      if ($val[0] !=".") { 
       showDir($dir . "/" . $val , $subdir + 1); 
      } 
     } 
    } 

    return true; 
} 
+0

謝謝你,但它顯示文件也 - 我只想要自己的文件夾:) – SoulieBaby 2010-06-23 02:27:46

+0

啊,我爲你修好了:)如果你需要它來顯示。和..,在$ scan = scandir後添加以下行: if($ subdir == 0){ echo「」; } – abelito 2010-06-23 03:04:50

+0

再次感謝你,但現在它沒有顯示任何東西:( – SoulieBaby 2010-06-23 03:16:29

6
//Requires PHP 5.3 
$it = new RecursiveTreeIterator(
    new RecursiveDirectoryIterator($dir)); 

foreach ($it as $k => $v) { 
    echo "<option>".htmlspecialchars($v)."</option>\n"; 
} 

您可以自定義前綴RecursiveTreeIterator::setPrefixPart

0

您可以使用PHP「來代替」功能http://php.net/manual/en/function.glob.php,並建立一個遞歸函數去無限級深度(即調用自身的函數)。這是短,然後使用 「SCANDIR」

function glob_dir_recursive($dirs, $depth=0) { 
    foreach ($dirs as $item) { 
     echo '<option>' . str_repeat('-',$depth*1) . basename($item) . '</option>'; //can use also "basename($item)" or "realpath($item)" 
     $subdir = glob($item . DIRECTORY_SEPARATOR . '*', GLOB_ONLYDIR); //use DIRECTORY_SEPARATOR to be OS independent 
     if (!empty($subdir)) { //if subdir array is not empty make function recursive 
      glob_dir_recursive($subdir, $depth+1); //execute the function again with current subdir, increment depth 
     } 
    } 
} 

用法:

$dirs = array('galleries'); //relative path examples: 'galleries' or '../galleries' or 'galleries/subfolder'. 
//$dirs = array($_SERVER['DOCUMENT_ROOT'].'/galleries'); //absolute path example 
//$dirs = array('galleries', $_SERVER['DOCUMENT_ROOT'].'/logs'); //multiple paths example 

echo '<select>'; 
glob_dir_recursive($dirs); //to list directories and files 
echo '</select>'; 

,這將產生完全相同的請求的輸出類型。

相關問題