我有一个具有这种结构的目录:
我可以创建一个函数来完成工作,但这次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 :(得分: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;
}
编辑它以使用非递归迭代器...
答案 1 :(得分:1)
为了记录其他人,我已经变成了一个可以读取包含其所有子节点并输出JSON或只是数组的类的类(RecursiveDirectoryIterator
)。
https://gist.github.com/jonataswalker/3c0c6b26eabb2e36bc90
输出的树查看器