2010-08-24 49 views
4

我有这个结构的目录:使用RecursiveDirectoryIterator将目录和文件列入数组?

  • 主/
    • | - 图像/
      • | - file1.jpg
      • | - file2.jpg
      • | - - file3.jpg
    • | - 文件/
      • | - 私人/
        • | --- blahblahblah.docx
      • | - Test.doc的
      • | - TEST.XLS
      • | - test.txt的

我可以创建一个函数来完成工作,但RecursiveDirectoryIterator类更快,内存使用量更少。如何使用RecursiveDirectoryIterator列出这些目录到像这样的数组:

array( 
    "main/" => array( 
     "images/" => array( 
      "file1.jpg", 
      "file2.jpg", 
      "file3.jpg" 
     ), 
     "documents/" => array( 
      "private/" => array( 
       "blahblahblah.docx" 
      ), 
      "test.doc", 
      "test.xls", 
      "test.txt" 
     ) 
    ) 
) 
+0

出于好奇,为什么你真的想要转换到嵌套*数组a *的树查看器?你打算如何处理这个数组,你无法通过迭代遍历这些目录? – Gordon 2010-08-24 14:55:44

+0

我只是想将目录的信息转换为嵌套数组:) – user366124 2010-08-24 16:06:56

+0

是的,但是为了什么目的?一旦拥有它,你将如何处理阵列?如果你没有做任何事情,这是毫无意义的要求。我问的原因是因为如果它只是一个中间格式,并且直接从Iterator转到您想要对数组执行操作,那么您可能会跳过多dim数组。 – Gordon 2010-08-24 16:26:57

回答

12

好了,在RecursiveIterator递归迭代,你需要一个RecursiveIteratorIterator(我知道这似乎是多余的,但它不是)...

然而,对于您的特定情况下(您想产生一个结构,而不是仅仅访问所有节点的),我认为定期递归会更适合...

function DirectoryIteratorToArray(DirectoryIterator $it) { 
    $result = array(); 
    foreach ($it as $key => $child) { 
     if ($child->isDot()) { 
      continue; 
     } 
     $name = $child->getBasename(); 
     if ($child->isDir()) { 
      $subit = new DirectoryIterator($child->getPathname()); 
      $result[$name] = DirectoryIteratorToArray($subit); 
     } else { 
      $result[] = $name; 
     } 
    } 
    return $result; 
} 

它编辑使用非递归迭代或者...

+0

我曾尝试你的代码,但它导致了一个严重的错误:( “调用未定义的方法SplFileInfo :: hasChildren()” – user366124 2010-08-24 13:40:16

+0

好吧,我编辑,以便它应该工作更好地为你的情况... – ircmaxell 2010-08-24 13:52:11

+0

谢谢但现在它给了我另一个错误:达到'100'的最大功能嵌套级别,放弃!:( – user366124 2010-08-24 15:17:40