0

我正在使用以下代码来获取目录数组及其子目录,其中每个目录都包含文件类型扩展名:png。它工作得很好,但我需要能够以列表样式格式输出数组的结果,例如

* Test
  -> test2.png
  -> test1.png
  * subfolder
    -> test3.png
    * sub sub folder
      -> test4.png

ETC

代码:

$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',
)

实现预期结果的最佳方法是什么?

4

2 回答 2

0

在你的 if 子句中,尝试:

$items[]=preg_replace("#\\\#", "/", $file->getPathName());

这应该会给你一个接近你想要的输出。但是,getPathName输出绝对路径。

于 2010-03-23T13:21:14.770 回答
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。您可以通过递归使用来获得相同的目的 regular DirectoryIterator)。

或者,如果您按深度对路径进行排序(编写比较函数),那么您只需打印带有适当缩进的最后一个路径组件即可输出它。

于 2010-12-13T13:35:16.640 回答