Войти

Показать полную графическую версию : дерево каталогов


slaine
24-02-2006, 00:33
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

<?
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
slaine
честно говоря я не понимаю как это вообще работает...
(т.е. почему ваш код вообще работает... по идее он не должен...)




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
А, как мне её вызывать, что мне ставить в $dirlist?
Объясните пожалста я запутался.


<?
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
slaine



$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
Vlad Drakula ваш код, который написал, показывает пустоту, вернее ничего непоказывает,
а мой код постом выше выдаёт такую фитюльку.:(

slaine
24-02-2006, 22:17
ok! вот наконец-то зделал рабочий скрипт!

<?
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, она первая.
Отдельно она прекрасно работает, но слить всё вместе неполучается.


<?
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*1024, 2)."</td></tr>";
}
echo "</table>";
?>

Igor_I
25-02-2006, 21:45
slaine
А ты можешь рассказать, мне - идиоту - зачем эта строка?
$depth = str_repeat(" ", $lvl);
И еще - ты исходный код страницы смотришь? Или то, что в браузере тебе хватает?

slaine
25-02-2006, 21:49
Igor_I ok.
Там в кавычках стоит &нбсп , для отступов подкаталогов.
Просто тег [PHP] так их и понял :)

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




© OSzone.net 2001-2012