【问题标题】:Multidimensional array created from directory structure从目录结构创建的多维数组
【发布时间】:2015-07-29 11:55:52
【问题描述】:

我正在尝试编写一个脚本来读取目录并创建一个多维数组,其结构和内容与文件系统上的结构相同。

过去我只是运行了一个遍历目录并将键设置为完整路径并将值设置为在该路径中找到的文件的脚本。这一次,这样的数组不会那么容易使用了。

我使用那个旧脚本来获取我正在使用的文件结构:

Array
(
    [0] => files/example
    [1] => files/example/2015
    [2] => files/example/2015/Documents
    [3] => files/example/2015/Documents/Catalogs
    [4] => files/example/2015/Documents/Manuals
    [5] => files/example/2015/Documents/Press-Releases
    [6] => files/example/2015/Documents/Sell-Sheets
    [7] => files/example/2015/Email-Templates
    [8] => files/example/2015/Email-Templates/HTML-Templates
    [9] => files/example/2015/Email-Templates/Outlook-Templates
    [10] => files/example/2015/Email-Templates/Template-Image-Files
    [11] => files/example/2015/Images
    [12] => files/example/2015/Images/Ads-and-Flyers
    [13] => files/example/2015/Images/Catalog-and-PoP-Graphics
    [14] => files/example/2015/Images/Files-for-Web
    [15] => files/example/2015/Images/High-Resolution-Files
    [16] => files/example/2015/Images/Lifestyle-Shots
    [17] => files/example/2015/Images/Logos-and-Brand-Identity
    [18] => files/example/2015/Images/Product-Images
    [19] => files/example/2015/Images/Vector-Files
    [20] => files/example/2015/Other-Files
)

最终/files 下会有更多文件夹,/files 的每个子文件夹内会有多年。

在我的搜索中,我发现有人提出了将单个路径转换为多维数组的方法,但我无法成功地使这些方法适应我的情况。有些部分起作用,有些根本不起作用。最接近我想要的方式是使用以下代码:

function getfiles($path,&$files){
    if(($h = opendir($path))){
        $args = explode('/',$path);
        $folder = array_pop($args);
        if(!isset($files[$folder])) $files[$folder] = array();
        while(($file = readdir($h)) !== false){
            $check = $path . '/' . $file;

            // directory
            if(is_dir($check)){
                if(!in_array($file,array('.','..'))){
                    getfiles($check, $files[$folder]);
                }

            // file
            }else if(!is_dir($check)){
                $files[$folder][] = $file;
            }
        }
    }
}

很遗憾,这并不完全正确。它给了我这个:

    Array(
    [example] => Array(
            [2015] => Array(
                    [Documents] => Array(
                            [Press-Releases] => Array()
                            [Sell-Sheets] => Array()
                            [Catalogs] => Array()
                            [Manuals] => Array()
                        )
                    [Images] => Array(
                            [Lifestyle-Shots] => Array()
                            [Files-for-Web] => Array()
                            [High-Resolution-Files] => Array()
                            [Product-Images] => Array()
                            [Catalog-and-PoP-Graphics] => Array()
                            [Ads-and-Flyers] => Array()
                            [Vector-Files] => Array()
                            [Logos-and-Brand-Identity] => Array()
                        )
                    [Other-Files] => Array()
                    [Email-Templates] => Array(
                            [Outlook-Templates] => Array()
                            [Template-Image-Files] => Array()
                            [HTML-Templates] => Array()
                        )
                )
        )

    [2015] => Array(
            [Documents] => Array(
                    [Press-Releases] => Array()
                    [Sell-Sheets] => Array()
                    [Catalogs] => Array()
                    [Manuals] => Array()
                )
            [Images] => Array(
                    [Lifestyle-Shots] => Array()
                    [Files-for-Web] => Array()
                    [High-Resolution-Files] => Array()
                    [Product-Images] => Array()
                    [Catalog-and-PoP-Graphics] => Array()
                    [Ads-and-Flyers] => Array()
                    [Vector-Files] => Array()
                    [Logos-and-Brand-Identity] => Array()
                )
            [Other-Files] => Array()
            [Email-Templates] => Array(
                    [Outlook-Templates] => Array()
                    [Template-Image-Files] => Array()
                    [HTML-Templates] => Array()
                )
        )
    [Documents] => Array(
            [Press-Releases] => Array()
            [Sell-Sheets] => Array()
            [Catalogs] => Array()
            [Manuals] => Array()
        )
    [Catalogs] => Array()
    [Manuals] => Array()
    [Press-Releases] => Array()
    [Sell-Sheets] => Array()
    [Email-Templates] => Array(
            [Outlook-Templates] => Array()
            [Template-Image-Files] => Array()
            [HTML-Templates] => Array()
        )
    [HTML-Templates] => Array()
    [Outlook-Templates] => Array()
    [Template-Image-Files] => Array()
    [Images] => Array(
            [Lifestyle-Shots] => Array()
            [Files-for-Web] => Array()
            [High-Resolution-Files] => Array()
            [Product-Images] => Array()
            [Catalog-and-PoP-Graphics] => Array()
            [Ads-and-Flyers] => Array()
            [Vector-Files] => Array()
            [Logos-and-Brand-Identity] => Array()
        )
    [Ads-and-Flyers] => Array()
    [Catalog-and-PoP-Graphics] => Array()
    [Files-for-Web] => Array()
    [High-Resolution-Files] => Array()
    [Lifestyle-Shots] => Array()
    [Logos-and-Brand-Identity] => Array()
    [Product-Images] => Array()
    [Vector-Files] => Array()
    [Other-Files] => Array()
)

如您所见,它为每个文件夹创建了一个根数组键,而不是仅仅停留在示例文件夹中。

我确定我的函数有一个简单的逻辑错误导致了这种情况,但要么我离它太近而没有注意到它,要么我的大脑不再与我合作。

或者这不是我想做的事情的正确方法。

提前感谢您提供的任何帮助。

【问题讨论】:

    标签: php arrays multidimensional-array


    【解决方案1】:

    呃,我是个白痴。我的功能没有问题,只是我使用它的方式。

    我正在遍历我在问题中发布的第一个数组以构建我的多维数组。这就是为什么我发布的最后一个数组充满了每个文件夹作为根数组键。

    不知道我在想什么。 (回答:我不是……)

    代替:

    $files = array()
    $struct = traverse('files/example');
    foreach($struct as $path){
        getfiles($path,$files);
    }
    

    我只需要这样做:

    $files = array();
    getfiles('files/example',$files);
    

    【讨论】:

      【解决方案2】:

      我使用RecursiveDirectoryIteratorRecursiveIteratorIteratoreval 以一种简单的方式实现了它

      $rootpath = '.';
      $fileinfos = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($rootpath));
      
      $tree = array();
      
      foreach($fileinfos as $pathname => $fileinfo) {
          if ($fileinfo->isFile()) {
              continue;
          }
      
          $arrayNotation = str_replace("/", "']['", str_replace(array('/.', '/..', '.'), '', $pathname));
      
          $str = <<<STRING
      if (!isset(\$tree['$arrayNotation'])) {
          \$tree['$arrayNotation'] = array();
      }
      STRING;
      
          eval($str);
      }
      
      echo '<pre>', var_dump($tree);
      

      【讨论】:

        猜你喜欢
        • 2018-03-27
        • 2021-09-09
        • 1970-01-01
        • 2019-11-27
        • 2023-01-17
        • 1970-01-01
        • 1970-01-01
        • 2016-07-28
        • 1970-01-01
        相关资源
        最近更新 更多