从数组中显示目录内容的“漂亮输出”

时间:2010-03-23 11:58:36

标签: php iterator directory recursive-datastructures

我正在使用以下代码来获取目录及其子目录的数组,其中每个目录包含文件类型扩展名: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',
)

达到预期结果的最佳方法是什么?

2 个答案:

答案 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来获得相同的结果。

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