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

时间:2011-04-24 08:27:56

标签: php foreach directory glob

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

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

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

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

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

$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';

6 个答案:

答案 0 :(得分:18)

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

$path = realpath('/etc');

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

答案 1 :(得分: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;
}

答案 2 :(得分:4)

使用此功能:

function dua_get_files($path)
{
    $dir_paths = array();
    foreach (glob($path . "/*", GLOB_ONLYDIR) as $filename)
    {
        $dir_paths[] = $filename;
        $a = glob("$filename/*", GLOB_ONLYDIR);
        if( is_array( $a ) )
        {
            $b = dua_get_files( "$filename/*" );
            foreach( $b as $c )
            {
                $dir_paths[] = $c;
            }
        }
    }
    return $dir_paths;
}

答案 3 :(得分:4)

非常奇怪 - 每个人都建议递归,但更好的只是循环:

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

答案 4 :(得分:1)

您可以使用php GLOB函数,但必须创建一个递归函数来扫描无限级别深度的目录。然后将结果存储在全局变量中。

function dua_get_files($path) {
    global $dir_paths; //global variable where to store the result
    foreach ($path as $dir) { //loop the input
        $dir_paths[] = $dir; //can use also "basename($dir)" or "realpath($dir)"
        $subdir =  glob($dir . DIRECTORY_SEPARATOR . '*', GLOB_ONLYDIR); //use DIRECTORY_SEPARATOR to be OS independent
        if (!empty($subdir)) { //if subdir is not empty make function recursive
            dua_get_files($subdir); //execute the function again with current subdir
        }
    }
}

//usage:
$path = array('galleries'); //suport absolute or relative path. support one or multiple path
dua_get_files($path);
print('<pre>'.print_r($dir_paths,true).'</pre>'); //debug

答案 5 :(得分:-1)

对于 PHP ,如果您使用的是linux / unix,则还可以使用反引号(shell执行)和unix find命令。在文件系统上进行目录搜索可能需要很长时间并且可以进行循环 - 系统find命令已经构建用于速度和处理文件系统循环。换句话说,系统exec调用可能比使用PHP本身搜索文件系统树花费更少的CPU时间。

$dirs = `find $path -type d`;

请记住清理$ path输入,以便其他用户不会传递安全危害路径名称(例如来自url或其他内容)。

将其放入数组

$dirs = preg_split("/\s*\n+\s*/",`find $path -type d`,-1,PREG_SPLIT_NO_EMPTY);