2015-04-04 20 views
0

子目录嵌套数组我有一个目录结构如下请使用RecursiveDirectoryIterator

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; 
    } 

结果

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\.. 
) 

回答

0
<?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函数基本上使用数组引用来指向“当前”目录。由于它将是一个多维数组,因此我们不必担心数组中的“where”(它可能是第一级,如果目录结构变得很深,它可能就是第100级)。它只是检查给定的元素是否是一个字符串,如果是,它是一个文件,否则它是一个目录,所以我们递归地再次调用createArray

可能更简单的解决方案,但我认为他们中的大多数使用基本的数组参考系统。

相关问题