PHP - 列出所有目录和子目录递归在下拉菜单中

问题描述:

可能重复:
PHP Get all subdirectories of a given directoryPHP - 列出所有目录和子目录递归在下拉菜单中

我希望有一个下拉菜单,显示在./files/$userid/的所有子目录不只是主文件夹。例如:/files/$userid/folder1/folder2/

我当前的代码是:

HTML:

<select name="myDirs"> 
<option value="" selected="selected">Select a folder</option> 

PHP:

if (chdir("./files/" . $userid)) { 

     $dirs = glob('*', GLOB_ONLYDIR); 
     foreach($dirs as $val){ 
      echo '<option value="'.$val.'">'.$val."</option>\n"; 
     }   
     } else { 
     echo 'Changing directory failed.'; 
} 
+0

而你的问题是什么?请记住,制定要求不是一个编程问题。我建议你先在网站上搜索你的要求,因为列表目录已经被各种口味询问和回答了。 [所以,为什么不去酒吧和订购饮料?](http://*.com/search) – hakre

+0

您将需要使用PHP的本机[RecursiveDirectoryIterator](http://php.net/manual/en /class.recursivedirectoryiterator.php)类。 [这个答案](http://*.com/a/2398163/427992)应该有所帮助。 – hohner

+0

我试过这个http://pastebin.com/fpJiiCbZ,但它不起作用。这是我得到的输出:http://i.imgur.com/gWt3U.png – Brian

RecursiveDirectoryIterator应该做的伎俩。不幸的是,文件是不是很大,所以这里有一个例子:

$root = '/etc'; 

$iter = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($root, RecursiveDirectoryIterator::SKIP_DOTS), 
    RecursiveIteratorIterator::SELF_FIRST, 
    RecursiveIteratorIterator::CATCH_GET_CHILD // Ignore "Permission denied" 
); 

$paths = array($root); 
foreach ($iter as $path => $dir) { 
    if ($dir->isDir()) { 
     $paths[] = $path; 
    } 
} 

print_r($paths); 

这会产生在我的电脑上输出如下:

Array 
(
    [0] => /etc 
    [1] => /etc/rc2.d 
    [2] => /etc/luarocks 
    ... 
    [17] => /etc/php5 
    [18] => /etc/php5/apache2 
    [19] => /etc/php5/apache2/conf.d 
    [20] => /etc/php5/mods-available 
    [21] => /etc/php5/conf.d 
    [22] => /etc/php5/cli 
    [23] => /etc/php5/cli/conf.d 
    [24] => /etc/rc4.d 
    [25] => /etc/minicom 
    [26] => /etc/ufw 
    [27] => /etc/ufw/applications.d 
    ... 
    [391] => /etc/firefox 
    [392] => /etc/firefox/pref 
    [393] => /etc/cron.d 
) 
+0

感谢@PleaseStand其工作正常,只需要一个更多的foreach循环列表视图像你的输出 –

+0

不错的一个。如果你能说明如何过滤掉隐藏的文件夹及其内容(比如'.svn')会更好。 – Raptor

+0

不适用于我...即使超时设置为1小时,目录计数只有1000 –

您可以在此功能使用递归水珠实现,如:

function rglob($pattern='*', $path='', $flags = 0) { 
$paths=glob($path.'*', GLOB_MARK|GLOB_ONLYDIR|GLOB_NOSORT); 
$files=glob($path.$pattern, $flags); 
foreach ($paths as $path) { 
    $files=array_merge($files,rglob($pattern, $path, $flags)); 
} 
return $files; 
} 
+0

@ user183391列出文件或文件夹? – Brian

+0

你可以使用GLOB_ONLYDIR作为$ flags参数 – Alex

你可以写的目录你自己的递归上市,如:

function expandDirectories($base_dir) { 
     $directories = array(); 
     foreach(scandir($base_dir) as $file) { 
      if($file == '.' || $file == '..') continue; 
      $dir = $base_dir.DIRECTORY_SEPARATOR.$file; 
      if(is_dir($dir)) { 
       $directories []= $dir; 
       $directories = array_merge($directories, expandDirectories($dir)); 
      } 
     } 
     return $directories; 
} 

$directories = expandDirectories(dirname(__FILE__)); 
print_r($directories); 
+2

这是一个很好的php解决方案,不需要使用外部库 – Katushai

+0

比较接受的答案和终端:'time php -f test.php',这个更快。 –