как создать HTML список каталогов сайта

abajun

Новичок
как создать HTML список каталогов сайта

Хочется командой dir создать структуру каталогов сайта
и затем все это вывести это в виде вложенного списка(ul - li).

Написал пока что то такое

PHP:
function get_leaf_dirs($dir) {
global $rt;
  $array = array();
   $d = dir($dir);
   while (false !== ($entry = $d->read())) {
       if($entry!='.' && $entry!='..') {
           $entry = $dir.'/'.$entry;
           if(is_dir($entry)) {
                if (isset($subdirs))
               {	
               $array = array_merge($subdirs,$array);
               	$array[] = $entry;
               } 
               else
               {
                $array[] = $entry;
                }
               $subdirs = get_leaf_dirs($entry);
           }
       }
   }
   $d->close();
   return $array;
}
Запутался с рекурсиями.
Заранее спасибо.
 

zerkms

TDD infected
Команда форума
function getdirs($dir) {
$result = array();
читаем содержимое dir
если файл, то пропускаем,
иначе:
$result[имя_текущего_каталога] = getdirs(текущий_каталог);

return $result;
}

думаю что примерно вот так ;)

на выходе должна получиться структура вроде:

dir1 => dir2,
dir3
dir4 => dir5
 

Фанат

oncle terrible
Команда форума
на самом деле, главная засада при написании таких вещей - это если человек не прелдставляет себе, в каком виде хочет получить результат.
я вот, пока не сел, и руками массив не нарисовал - так и не справился.

а рекурсивную структуру удобнее выводить как раз не из вложенных массивов, а из одного, линейного.

я тут писал, как разЮ, недавно об этом
 

zerkms

TDD infected
Команда форума
Фанат
угу, тоже верно

abajun
тогда в функцию добавляется второй аргумент $level с умолчальным значением 0
 

abajun

Новичок
Массив в принципе не важно какой.
Главное чтобы потом из него можно было нетрудно получить такое:
<ul>
<li>1</li>
<li>2
<ul>
<li>2.1</li>
<li>2.2</li>
</ul>
</li>
</ul>
 

zerkms

TDD infected
Команда форума
abajun
все предпосылки к созданию функции у тебя уже есть
 

abajun

Новичок
Автор оригинала: zerkms
abajun
все предпосылки к созданию функции у тебя уже есть
Oсталось за малым.
Хотябы как должен выглядеть массив?
И все время у меня<li>, ,то не там открываются , то не там закрываются.

В принципе нужно две вункции, одна делает массив, другая из него список.
Если с первой все боле менее понятно, то со второй что-то не срастается.
 

zerkms

TDD infected
Команда форума
Хотябы как должен выглядеть массив?
так как тебе будет удобно с ним работать, например:

0 => array('name' => 'foo', 'level' => 1)
1 => array('name' => 'bar', 'level' => 2)
2 => array('name' => 'baz', 'level' => 1)

И все время у меня<li>, ,то не там открываются , то не там закрываются.
значит неправильно открываешь или закрываешь ;) смотри внимательно в код
 

abajun

Новичок
Автор оригинала: zerkms
так как тебе будет удобно с ним работать, например:

0 => array('name' => 'foo', 'level' => 1)
1 => array('name' => 'bar', 'level' => 2)
2 => array('name' => 'baz', 'level' => 1)


значит неправильно открываешь или закрываешь ;) смотри внимательно в код
Дело не в правильном открытии и закрытии, а в самом алгоитме, такого дела.
В принципе. Это должна быть рекрусия?
 

zerkms

TDD infected
Команда форума
abajun
ты уверен что ты читаешь все посты? если нет - то перечитай заново мой первый пост в этой теме. если да - то всё равно перечитай
 

abajun

Новичок
Такой бы массив получить из каталогов сайта

$a_tree=array(
array('k_item' =>1,'s_name' =>'1','a_tree' => array(
array('k_item' =>2,'s_name' =>'1.1','a_tree' => array(
array('k_item' =>3,'s_name' =>'1.1.1','a_tree' => array()),
array('k_item' =>4,'s_name' =>'1.1.2','a_tree' => array()),
array('k_item' =>5,'s_name' =>'1.1.3','a_tree' => array(
array('k_item' =>6,'s_name' =>'1.1.3.1','a_tree' => array())
)),
)),
array('k_item' =>7,'s_name' =>'1.2','a_tree' => array()),
array('k_item' =>8,'s_name' =>'1.3','a_tree' => array(
array('k_item' =>9,'s_name' =>'1.3.1','a_tree' => array()),
array('k_item' =>10,'s_name' =>'1.3.2','a_tree' => array())
)),
array('k_item' =>11,'s_name' =>'1.4','a_tree' => array(
array('k_item' =>12,'s_name' =>'1.4.1','a_tree' => array())
)),
)),
array('k_item' =>13,'s_name' =>'2','a_tree' => array()),
array('k_item' =>14,'s_name' =>'3','a_tree' => array(
array('k_item' =>15,'s_name' =>'3.1','a_tree' => array())
))
);

-~{}~ 13.09.06 17:20:

Автор оригинала: Фанат
может, поможет
http://phpclub.ru/talk/showthread.php?s=&threadid=89918
Читал эту бодягу, меня резко тормозит на этих рукрусиях :(

-~{}~ 18.09.06 10:09:

Что-то все молчат!!
Может не у одного меня с рекрусией плохо.
 

Фанат

oncle terrible
Команда форума
у кого плохо - тот делает хорошо. С РЕКУРСИЕЙ.
Не хватаясь за всё сразу - и хтмл, и каталоги, и рекурсия - а сначала осваивая рекурсию, потом каталоги, а потом только хтмл.

напиши сначала простенькую рекурсивную функцию и разберись с ней.
без массивов. пусть просто выводит каталоги.
Хоть это ты можешь ПОПРОБОВАТЬ написать?
 

abajun

Новичок
Да такое есть, даже с массивом
Если $array[] = $entry; заменить на print $entry.'<br>';
будет тоже, но без массива.

function read_dir($dir) {
$array = array();
$d = dir($dir);
while (false !== ($entry = $d->read())) {
if($entry!='.' && $entry!='..') {
$entry = $dir.'/'.$entry;
if(is_dir($entry)) {
$array[] = $entry;
$array = array_merge($array, read_dir($entry));
} else {
// $array[] = $entry;
}
}
}
$d->close();
return $array;
}

Дальше это дело хочу преобразовать во вложенный масив
вида описанного выше.

-~{}~ 18.09.06 14:48:

Что-то не выходит.

воттакое написал
function read_dir($dir) {
static $i=1;
static $k=0;
$array = array();
$d = dir($dir);
while (false !== ($entry = $d->read())) {
if($entry!='.' && $entry!='..') {
$entry = $dir.'/'.$entry;

if(is_dir($entry)) {
$array[$k]['k_item'] = $i; $i++;
$array[$k]['s_name'] = $entry;



$array[$k]['a_tree'] = array_merge($array, read_dir($entry));
$k++;
} else {

$array[$k]['a_tree']=array('');
}
}
}
$i++;
$d->close();
return $array;
}

Виснет и не то выводит.
 
Сверху