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

Posted

技术标签:

【中文标题】PHP - 在下拉菜单中递归列出所有目录和子目录[重复]【英文标题】:PHP - Listing all directories and sub-directories recursively in drop down menu [duplicate] 【发布时间】:2012-12-27 14:46:16 【问题描述】:

可能重复:php Get all subdirectories of a given directory

我想要一个下拉菜单来显示./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.';

【问题讨论】:

你的问题是?请记住,制定需求不是编程问题。我建议您首先在网站上搜索您的要求,因为已经以各种方式询问和回答了列表目录。 So why not take a place at the bar and order your drink? 您需要使用 PHP 的原生 RecursiveDirectoryIterator 类。 This answer 应该有帮助。 我试过这个pastebin.com/fpJiiCbZ,但它不起作用。这是我得到的输出:i.imgur.com/gWt3U.png 您没有实现正确的代码。复制并粘贴上面答案中列出的 PHP 代码,它应该可以工作。 我做了,我不想获得文件名,只想要文件夹。答案中的“work.txt”是什么? (复制粘贴代码返回空下拉) 【参考方案1】:

您可以像在这个函数中那样使用递归 glob 实现:

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;

【讨论】:

@user183391 列出文件或文件夹? 您可以将 GLOB_ONLYDIR 用于 $flags 参数【参考方案2】:

您可以编写自己的目录递归列表,例如:

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 解决方案,无需使用外部库 比较接受的答案和这个,终端:time php -f test.php,这个更快。【参考方案3】:

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)会更好。 对我不起作用......即使在目录计数仅为 1000 时设置为一小时的超时时间也会超时

以上是关于PHP - 在下拉菜单中递归列出所有目录和子目录[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 zipfile 中递归列出所有目录而不在 python 中提取

递归列出给定目录下的所有文件和目录

在Unix中递归列出文件中的所有文件? [复制]

如何在 Linux 上递归列出 C 中的目录?

递归列出一个目录下所有的文件夹和文件

列出目录中的所有序列(递归)