【问题标题】:Make a nested array of subdirectories using RecursiveDirectoryIterator使用 RecursiveDirectoryIterator 创建一个嵌套的子目录数组
【发布时间】:2015-04-04 14:19:27
【问题描述】:

我有以下目录结构

test
  directory_in_test
    directory_in_directory_in_test
  directory2_in_test
    directory_in_directory2_in_test
  abc.php
index.php

我正在尝试创建一个函数,该函数将提供一个多维的子目录数组。所需的输出类似于:

[directories] => Array(
    [test] => Array(
        [directory_in_test] => Array(
            [directory_in_directory_in_test] => null
        )
        [directory2_in_test] => Array(
            [directory_in_directory2_in_test] => null
        )      
    )
)

我尝试将RecursiveIteratorIteratorRecursiveDirectoryIterator 一起使用,但它提供了一个目录和文件的一级数组,这与我的要求相去甚远。这是我的代码和结果

代码

<?php
    public function findDirectories($path = '', $like = '')
    {
        $path = (is_dir($path)) ? $path : getcwd();
        $directories = array();
        $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path));
        foreach ($iterator as $directory) {
            if($directory->isDir())
                $directories[] = $directory->getPathName();
        }

        return $directories;
    }

打印 $directories 的结果

Array
(
    [0] => D:\xampp\htdocs\raheelwp\file-resolver\tests\.
    [1] => D:\xampp\htdocs\raheelwp\file-resolver\tests\..
    [2] => D:\xampp\htdocs\raheelwp\file-resolver\tests\directory2_in_test\.
    [3] => D:\xampp\htdocs\raheelwp\file-resolver\tests\directory2_in_test\..
    [4] => D:\xampp\htdocs\raheelwp\file-resolver\tests\directory2_in_test\directory_in_directory2_in_test\.
    [5] => D:\xampp\htdocs\raheelwp\file-resolver\tests\directory2_in_test\directory_in_directory2_in_test\..
    [6] => D:\xampp\htdocs\raheelwp\file-resolver\tests\directory_in_test\.
    [7] => D:\xampp\htdocs\raheelwp\file-resolver\tests\directory_in_test\..
    [8] => D:\xampp\htdocs\raheelwp\file-resolver\tests\directory_in_test\direcotry_in_directory_in_test\.
    [9] => D:\xampp\htdocs\raheelwp\file-resolver\tests\directory_in_test\direcotry_in_directory_in_test\..
) 

【问题讨论】:

    标签: php recursion foreach spl


    【解决方案1】:
    <?php
    
    $it = new RecursiveDirectoryIterator(".", RecursiveDirectoryIterator::SKIP_DOTS);
    $it = new RecursiveIteratorIterator($it);
    
    $files = new RecursiveArrayIterator(array());
    foreach ($it as $fi) {
        $it = $files;
        $dirs = explode('/', $fi->getPath());
        foreach ($dirs as $path) {
            if (isset($it[$path])) {
                $it = $it[$path];
            } else {
                $it[$path] = new RecursiveArrayIterator();
            }
        }
    
        $it[$fi->getFileName()] = $fi->getFileName();
    }
    
    
    
    $a = array();
    createArray($a, $files);
    print_r($a);
    
    function createArray(&$a, $it) {
        foreach ($it as $k => $tmp) {
            if (is_string($tmp)) {
                $a[] = $tmp;
            } else {
                $a[$k] = array();
                createArray($a[$k], $tmp);
            }
        }
    }
    

    代码相当简单,并且分成两部分,尽管它可以很容易地创建为一个部分。第一部分会将目录拆分为单独的RecursiveArrayIterators,因此您可以保留“迭代器”功能来使用它来执行各种其他操作。当您开始使用 SPL 迭代器时,这通常很有用。

    第二部分,createArray 函数基本上使用数组引用来指向“当前”目录。由于它将是一个多维数组,我们不必担心我们实际在数组中的“位置”(它可能是第 1 级,如果您的目录结构有那么深,它也可能是第 100 级)。它只是检查给定元素是否为字符串,如果是,则为文件,否则为目录,因此我们再次递归调用createArray

    可能是更简单的解决方案,但我认为它们中的大多数仍然使用基本的数组引用系统。

    【讨论】:

      猜你喜欢
      • 2011-09-07
      • 2021-08-16
      • 2011-09-28
      • 2014-08-17
      • 2022-07-02
      • 2018-05-13
      • 2011-03-28
      • 2021-10-10
      • 2012-06-13
      相关资源
      最近更新 更多