Вывести `симпатичный вывод` содержимого каталога из массива - PullRequest
0 голосов
/ 23 марта 2010

Я использую следующий код для получения массива каталогов и их подкаталогов, каждый из которых содержит расширение типа файла: 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 голосов
/ 13 декабря 2010

Если вы хотите отобразить файлы перед каталогами, то вы не можете сделать это просто в цикле, потому что вы не будете знать, появятся ли другие файлы позже.

Вам нужно объединить данные вдерево (массив массивов, проиндексированных компонентом пути) или сортируйте его.

$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).

Или если вы сортируете пути по глубине (напишите свою функцию сравнения), тогдаможно вывести его, просто напечатав последний компонент пути с соответствующим отступом.

0 голосов
/ 23 марта 2010

В вашем предложении if попробуйте:

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

Это должно дать вам результат, близкий к желаемому.Однако getPathName выводит абсолютные пути.

...