代码之家  ›  专栏  ›  技术社区  ›  Gislef

如何用glob创建子目录数组

  •  0
  • Gislef  · 技术社区  · 7 年前

    我有以下目录结构:

    MainFolder
        Folder1
            Folder1-1
                 Folder1-1-1  
                 Folder1-1-2
                 Folder1-1-3    
            Folder1-2
                 Folder1-2-1  
                 Folder1-2-2
                 Folder1-2-3  
        Folder2
            Folder2-1
                 Folder2-1-1  
                 Folder2-1-2
                 Folder2-1-3  
            Folder2-2
                 Folder2-2-1  
                 Folder2-2-2
                 Folder2-2-3
    

    我正在尝试创建3个数组

    2-Folder1、Folder2等内部的子文件夹数组(例如:Folder1-1…Folder2-1…)

    这样我只能过滤当前目录的子目录:

    //path to directory to scan
    $directory = "MainFolder/";
    
    //get all files in specified directory
    $files = glob($directory . "*");
    
    //print each file name
    foreach($files as $file)
    {
     //check to see if the file is a folder/directory
     if(is_dir($file))
     {
      echo $file;
     }
    }
    

    但是,对于glob,如何过滤当前目录并自动分组到数组中呢?

    我已经看到了 RecursiveDirectoryIterator 存在,但我不知道如何将它放在不同的数组中

    2 回复  |  直到 7 年前
        1
  •  2
  •   JCH77    7 年前

    你有一个固定的低深度,所以你不需要递归imho。

    可以使用通配符*标记不同的级别和级别 全球航空公司 仅检索文件夹:

    $level1 = glob('MainFolder/*', GLOB_ONLYDIR);
    $level2 = glob('MainFolder/*/*', GLOB_ONLYDIR);
    $level3 = glob('MainFolder/*/*/*', GLOB_ONLYDIR);
    

    如果要存储最后一个文件夹而不是完整路径,可以使用 数组映射() :

    $level1 = array_map('basename', glob('MainFolder/*', GLOB_ONLYDIR));
    ...
    
        2
  •  1
  •   Barmar    7 年前

    将代码放入函数中,以便可以在特定级别为每个目录调用它。

    function all_subdirectories($directory) {
        $files = glob("$directory/*");
        return array_filter($files, 'is_dir');
    }
    

    $all_levels = array();
    $dirs = array("MainFolder");
    while (!empty($dirs)) {
        $next_level = array();
        foreach ($dirs as $dir) {
            $next_level += all_subdirectories($dir);
        }
        if (!empty($next_level)) {
            $all_levels[] = array_map('basename', $next_level);
        }
        $dirs = $next_level;
    }
    
    print_r($all_levels);
    

    只需3个级别,就更简单了:

    $level1 = all_subdirectories("MainFolder");
    $level2 = all_subdirectories("MainFolder/*");
    $level3 = all_subdirectories("MainFolder/*/*");