Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   дерево каталогов (http://forum.oszone.net/showthread.php?t=61713)

slaine 24-02-2006 00:33 410203

дерево каталогов
 
Hi!
Вот есть две папки cute и test с поддиректориям sub_cute и sub_test:
Код:

cute/sub_cute
test/sub_test

Хочу зделать функцию, которая выводиля бы их все,
в такои виде:

Код:

cute
sub_cute
test
sub_test

а получается так:

Код:

sub_cute
sub_test
cute
test

PHP код:

<?
function aaa($j){
$dirlist = array();
$dir opendir($j);
    while (
$file readdir($dir)){
$path $j."/".$file;
if (
$file != ".." && $file != "." && is_dir($path)){
$dirlist[] = $file
aaa($path); 
}
}
closedir($dir);
echo 
"<table border=0 cellspacing=1 cellpadding=2 width=240";
echo 
"<tr></tr>";
for (
$i 0$i count($dirlist); $i ++){ 
echo 
"<tr><td width=170>".$dirlist[$i]."</td>
</tr>"
;
}
echo 
"<table>";
}
aaa(".");
?>


Vlad Drakula 24-02-2006 10:57 410287

slaine
честно говоря я не понимаю как это вообще работает...
(т.е. почему ваш код вообще работает... по идее он не должен...)

PHP код:

function aaa($dirlist$j){
  
$dir opendir($j);
  while (
$file readdir($dir)){
    
$path $j."/".$file;
    if (
$file != ".." && $file != "." && is_dir($path)){
      
$dirlist[] = $file;
      
aaa($dirlist$path);
    }
  }
  
closedir($dir);


хотя понял... но ван нужно больше опыта по работе с рекурсивными алгоритмами!

slaine 24-02-2006 12:16 410315

А, как мне её вызывать, что мне ставить в $dirlist?
Объясните пожалста я запутался.

PHP код:

<?
function aaa(&$dirlist$j){ 
$dir opendir($j); 
while (
$file readdir($dir)){ 
    
$path $j."/".$file
    if (
$file != ".." && $file != "." && is_dir($path)){ 
     
$dirlist[] = $file
     
aaa($dirlist$path); 
    } 

closedir($dir); 
echo 
"<table border=0 cellspacing=1 cellpadding=2 width=240";
echo 
"<tr></tr>";
for (
$i 0$i count($dirlist); $i ++){ 
echo 
"<tr><td width=170>".$dirlist[$i]."</td>
</tr>"
;
}
echo 
"<table>";
}
aaa($dirlist".");
?>

Код:

cute
sub_cute
cute
sub_cute
cute
sub_cute
test
sub_test
cute
sub_cute
test
sub_test
cute
sub_cute
test
sub_test


Vlad Drakula 24-02-2006 12:41 410321

slaine
PHP код:

$dirlist = array();
aaa($dirlist".");

echo 
"<table border=0 cellspacing=1 cellpadding=2>";
for (
$i 0$i count($dirlist); $i ++){
  echo 
"<tr><td>".$dirlist[$i]."</td></tr>";
}
echo 
"</table>"


slaine 24-02-2006 12:51 410324

Vlad Drakula ваш код, который написал, показывает пустоту, вернее ничего непоказывает,
а мой код постом выше выдаёт такую фитюльку.:(

slaine 24-02-2006 22:17 410555

ok! вот наконец-то зделал рабочий скрипт!
PHP код:

<?
    
function aaa($j$lvl){
    
$lvl ++;
    
$depth str_repeat("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"$lvl);
    
$dir opendir($j);
    while (
$file readdir($dir)){
    
$path $j."/".$file;
    if (
$file != ".." && $file != "." && is_dir($path)){
    echo 
$depth.$file."<BR>";
    
aaa($path$lvl); 
    }
    }
    
closedir($dir);
    }
    
aaa("."0);
?>

Вот возник ещё вопрос, который я не могу разрешить.
Thanks to Vlad Drakula за помощь.
Тепер я хочу для каждой директории показывать её размер,
но что-то не ладится, непойму в чём дело, помогите!
За размер директорий отвечает функция d_size, она первая.
Отдельно она прекрасно работает, но слить всё вместе неполучается.

PHP код:

<?
    
function d_size($k){ 
    
$v opendir($k);
    
$size 0;
    while (
$fl readdir($v)){
    if (
is_file($k."/".$fl)){ 
    
$size += filesize($k."/".$fl);
    } 
    }
    
closedir($v);
    return 
$size
    }
    function 
aaa(&$dirlist$j$lvl){
    
$lvl ++;
    
$depth str_repeat("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"$lvl);
    
$dir opendir($j);
    while (
$file readdir($dir)){
    
$path $j."/".$file;
    if (
$file != ".." && $file != "." && is_dir($path)){
    
$dirlist[] = $depth.$file;
    
aaa($dirlist$path$lvl); 
    }
    }
    
closedir($dir);
    }
    
$dirlist = array();
    
aaa($dirlist"."0);
    echo 
"<table border=0 cellspacing=1 cellpadding=2 bgColor=#ffffff>";
    for (
$i 0$i count($dirlist); $i ++){
    if (
is_int($i/2)){
    
$c_status "#dddddd";
    } else {
    
$c_status "#eeeeee";
    }
    echo 
"<tr><td bgColor=".$c_status.">".$dirlist[$i]."</td>
    <td bgColor="
.$c_status.">".BcDIV(d_size($dirlist[$i]), 1024*10242)."</td></tr>";
    }
    echo 
"</table>";
?>


Igor_I 25-02-2006 21:45 410890

slaine
А ты можешь рассказать, мне - идиоту - зачем эта строка?
PHP код:

$depth str_repeat("     "$lvl); 

И еще - ты исходный код страницы смотришь? Или то, что в браузере тебе хватает?

slaine 25-02-2006 21:49 410894

Igor_I ok.
Там в кавычках стоит &нбсп , для отступов подкаталогов.
Просто тег [php] так их и понял :)

Igor_I 26-02-2006 20:45 411299

Следи за мыслью:
$depth = str_repeat(" ", $lvl);
$dirlist[] = $depth.$file;
$dirlist[$i] - что будет здесь?
А зачем 2 раза считывать один и тот же каталог?


Время: 09:22.

Время: 09:22.
© OSzone.net 2001-