我正在使用以下代码来获取目录及其子目录的数组,其中每个目录包含文件类型扩展名:png。它工作得很好,但我需要能够以列表样式格式输出数组的结果,例如
* Test
-> test2.png
-> test1.png
* subfolder
-> test3.png
* sub sub folder
-> test4.png
等
代码:
$filter=".png";
$directory='../test';
$it=new RecursiveDirectoryIterator("$directory");
foreach(new RecursiveIteratorIterator($it) as $file){
if(!((strpos(strtolower($file),$filter))===false)||empty($filter)){
$items[]=preg_replace("#\\\#", "/", $file);
}
}
结果示例数组:
array (
0 => '../test/test2.png',
1 => '../test/subfolder/subsubfolder/test3.png',
2 => '../test/subfolder/test3.png',
3 => '../test/test1.png',
)
达到预期结果的最佳方法是什么?
答案 0 :(得分:0)
在你的if子句中,试试:
$items[]=preg_replace("#\\\#", "/", $file->getPathName());
这应该会给你一个接近你想要的输出。但是,getPathName
输出绝对路径。
答案 1 :(得分:0)
如果你想在目录之前显示文件,那么就不能简单地在循环中进行,因为你不知道以后会有更多文件出现。
您需要聚合树中的数据(由路径组件索引的数组数组)或对其进行排序。
$components = explode('/',$path);
$file = array_pop($components);
$current = $root;
foreach($components as $component) {
if (!isset($current[$component])) $current[$component] = array();
$current = &$current[$component];
}
$current[$file] = true;
它应该给你这样的结构:
array(
'test'=>array(
'test1.png'=>true,
'subfolder'=>array(
…
这将是直截了当的(当然这有点击败了RecursiveDirectoryIterator
的目的。你可以通过递归使用常规DirectoryIterator
来获得相同的结果。
或者,如果按深度对路径进行排序(编写比较函数),则只需打印具有适当缩进的最后路径组件即可输出它。