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.';
}
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
)
感谢@PleaseStand其工作正常,只需要一个更多的foreach循环列表视图像你的输出 –
不错的一个。如果你能说明如何过滤掉隐藏的文件夹及其内容(比如'.svn')会更好。 – Raptor
不适用于我...即使超时设置为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;
}
你可以写的目录你自己的递归上市,如:
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);
这是一个很好的php解决方案,不需要使用外部库 – Katushai
比较接受的答案和终端:'time php -f test.php',这个更快。 –
而你的问题是什么?请记住,制定要求不是一个编程问题。我建议你先在网站上搜索你的要求,因为列表目录已经被各种口味询问和回答了。 [所以,为什么不去酒吧和订购饮料?](http://stackoverflow.com/search) – hakre
您将需要使用PHP的本机[RecursiveDirectoryIterator](http://php.net/manual/en /class.recursivedirectoryiterator.php)类。 [这个答案](http://stackoverflow.com/a/2398163/427992)应该有所帮助。 – hohner
我试过这个http://pastebin.com/fpJiiCbZ,但它不起作用。这是我得到的输出:http://i.imgur.com/gWt3U.png – Brian