чтение дирректорий и поддерикторий и вывод файлов

IBSN

Новичок
чтение дирректорий и поддерикторий и вывод файлов

мой код после выполнения выводит все дирректории и файлы с относительным путем:

массив файлов:
dir/dir2/test2.txt
dir/dir2/dir3/test3.txt
dir/test.txt

массив дирректорий:
dir/dir2
dir/dir2/dir3


вопрос, каким образом можно построить такую структуру из вышеприведенной если учесть что количество файлов и дирректорий может быть n кол.?

dir
- test.txt
dir/dir2
- test2.txt
dir/dir2/dir3/
- test3.txt


даже мыслей нет как это можно сконструировать :confused:
 

young

Новичок
рекурсивная функция, один из примеров найденных в комментах

PHP:
 function walk_dir($path)
 {
   if ($dir = opendir($path)) {
     while (false !== ($file = readdir($dir)))
     {
       if ($file[0]==".") continue;
       if (is_dir($path."/".$file))
         $retval = array_merge($retval,walk_dir($path."/".$file));
       else if (is_file($path."/".$file))
         $retval[]=$path."/".$file;
     }
     closedir($dir);
   }
   return $retval;
 }
 

IBSN

Новичок
результат работы данной функции:
Array ( [0] => dir/dir2/test2.txt [1] => dir/dir2/dir3/test3.txt [2] => dir/test.txt )

это одно и тоже что дает и моя функция но мне нужно разложить результат на такой вид:

dir
- test.txt
dir/dir2
- test2.txt
dir/dir2/dir3/
- test3.txt


тоесть допустим есть n файлов:

dir
- n1.exe
- n2.exe
- n3.exe
dir/dir2
- g1.exe
dir/dir2/dir3
- h1.exe
- h2.exe
- h3.exe
- h4.exe

как бы дерево получить
 

fixxxer

К.О.
Партнер клуба
Передавай в рекурсивную функцию помимо каталога ссылку на нужный массив
 

IBSN

Новичок
вот код выводит как надо:
PHP:
<?
function walk_dir($path) 
{ 
   if ($dir = opendir($path)) { 
     while (false !== ($file = readdir($dir))) 
     { 
       if ($file[0]==".") continue; 
       if (is_dir($path."/".$file)) 
         $retval = array_merge($retval,walk_dir($path."/".$file)); 
       else if (is_file($path."/".$file)) 
         $retval[]=$path."/".$file; 
     } 
     closedir($dir); 
   } 

foreach ((array)$retval as $item) {
$dd=$item;
$d=dirname($dd);
$new[$d][]=$item;
}


$di=array_keys((array)$new);
for($i=0; $i<count($new); $i++)
{
echo "Дирректория - $di[$i] (".count($new[$di[$i]]).")<br>";

for($ii=0; $ii<count($new[$di[$i]]); $ii++)
{
echo " - ".basename($new[$di[$i]][$ii])."<br>";
}
}

}
$path='dir';
walk_dir($path);
?>
НО, почему то если дирректория пустая он ее не выводит =(

Что тут не так???
 
Сверху