使用PHP glob获取文件夹 - 深度不受限制

Jen*_*ell 13 php directory foreach glob

我有这个工作函数,找到文件夹并创建一个数组.

function dua_get_files($path)
{
    foreach (glob($path . "/*", GLOB_ONLYDIR) as $filename)
    {
        $dir_paths[] = $filename;   
    }
    return $dir_paths;
}
Run Code Online (Sandbox Code Playgroud)

此功能只能查找当前位置的目录.我想在子文件夹及其子文件夹中找到目录路径,依此类推.

该数组仍应是目录路径的平面列表.

输出数组应如何显示的示例

$dir_path[0] = 'path/folder1';
$dir_path[1] = 'path/folder1/child_folder1';
$dir_path[2] = 'path/folder1/child_folder2';
$dir_path[3] = 'path/folder2';
$dir_path[4] = 'path/folder2/child_folder1';
$dir_path[5] = 'path/folder2/child_folder2';
$dir_path[6] = 'path/folder2/child_folder3';
Run Code Online (Sandbox Code Playgroud)

Pas*_*TIN 18

如果你想以递归方式处理目录,你应该看一下RecursiveDirectoryIterator.

$path = realpath('/etc');

$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
foreach($objects as $name => $object){
    echo "$name\n";
}
Run Code Online (Sandbox Code Playgroud)


Cru*_*der 6

非常奇怪-每个人都建议递归,但最好还是循环一下:

$dir ='/dir';
while($dirs = glob($dir . '/*', GLOB_ONLYDIR)) {
  $dir .= '/*';
  if(!$result) {
     $result = $dirs;
   } else {
      $result = array_merge($result, $dirs);
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 好的!但是,当然,它绝对没有什么“非常奇怪”:使用递归过程来迭代递归结构可能是最明显的事情。 (3认同)

Ali*_*xel 5

试试这个:

function dua_get_files($path)
{
    $data = array();
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);

    foreach ($files as $file)
    {
        if (is_dir($file) === true)
        {
            $data[] = strval($file);
        }
    }

    return $data;
}
Run Code Online (Sandbox Code Playgroud)