создать структуру каталога

Статус
В этой теме нельзя размещать новые ответы.

MSW

Мой дом здесь!
Регистрация
27 Авг 2007
Сообщения
491
Реакции
414
есть структура, тоесть массив с содержимым:
dir1/file1
dir1/file2
dir2/dir3/file1
dir2/dir3/file2
dir2/dir4/file1
dir2/dir4/file2


как из неё получить такую структуру:
dir1:
- file1
- file2
dir2
- dir3
-- file1
-- file2
- dir4
-- file1
-- file2

может кто-то подскажет?
 
интересная задачка. побольше бы таких. реализовал для любого количества вложений.

PHP:
<?
$st[] = "dir1/file1";
$st[] = "dir1/file2";
$st[] = "dir2/dir3/file1";
$st[] = "dir2/dir3/file2";
$st[] = "dir2/dir4/file1";
$st[] = "dir2/dir4/file2";

for ($i=0; $i<count($st); $i++)
{
	$tmp = explode ("/", $st[$i]);

	for ($j=0; $j<count($tmp)-1; $j++)
		if ($tmp[$j] != $level[$j])
		{
			$level[$j] = $tmp[$j];
			$result[] = str_repeat("-", $j).$tmp[$j];
		}
	if (count($tmp))
		$result[] = str_repeat("-", count($tmp)-1).$tmp[count($tmp)-1];
}

for ($i=0; $i<count($result); $i++)
	print $result[$i]."\n";

?>
 
  • Нравится
Реакции: MSW
diavolic
спасибо большое, а то я сутки уже с этим мучаюсь :)

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

PHP:
$st[] = "dir1/file1";
$st[] = "dir1/file2";
$st[] = "dir2/dir2.1/file1";
$st[] = "dir2/dir2.1/file2";
$st[] = "dir2/dir2.2/file1";
$st[] = "dir2/dir2.2/file2";
$st[] = "file1";
$st[] = "file2";

foreach($st as $f) {
    $tmp = explode ("/", $f);
    $c = count($tmp);
    if($c==2) $z[$tmp[0]][] = $tmp[1];
    elseif($c==3) $z[$tmp[0]][$tmp[1]][] = $tmp[2];
    elseif($c==4) $z[$tmp[0]][$tmp[1]][$tmp[2]][] = $tmp[3];
}
print_r($z);

в конечном итоге хочу получить нечто такое:

Код:
<div onclick="javascript:ShowOrHide('t_dir1')">dir1</div>
<div id="t_dir1">file1<br>file2</div>

<div onclick="javascript:ShowOrHide('t_dir2')">dir2</div>
<div id="t_dir2">
<div onclick="javascript:ShowOrHide('t_dir2.1')">dir2.1</div>
<div id="t_dir2.1">file1<br>file2</div>
<div onclick="javascript:ShowOrHide('t_dir2.2')">dir2.2</div>
<div id="t_dir2.1">file1<br>file2</div>
</div>

<div onclick="javascript:ShowOrHide('t_dir3')">dir3</div>
<div id="t_dir3">
<div onclick="javascript:ShowOrHide('t_dir3.1')">dir3.1</div>
<div id="t_dir3.1">file1<br>file2</div>
<div onclick="javascript:ShowOrHide('t_dir3.2')">dir3.2</div>
<div id="t_dir3.2">file1<br>file2</div>
</div>
file1<br>file2
 
Ребята если нужен не ограниченный уровень вложений и при формирования дерева нам не известна его структура тогда проще всего использовать рекурсию, вот набросал пример, рабочий, а дальше уже дело техники:

PHP:
<?php
$next_dir = null;
$start_dir = "d:/apps/localhost/www/";
if( is_dir($start_dir) )
{
  $dh = opendir($start_dir);
  while(($dd = readdir($dh)) !== false){
   if( $dd!=".." and $dd!="." )
   {
    if( is_dir($start_dir . $dd) ){
     echo '<b>'.$dd.'[dir]</b><br/>';
     buildTree($start_dir . $dd);
    }
    else
    {
     echo $dd.'<br/>';
    }
   }

  }
  closedir($dh);
}

function buildTree($dir=null)
{
 $dh = opendir($dir);
 while(( $dd = readdir($dh)) !== false)
 {
  if( $dd!=".." and $dd!=".")
  {
   $path = $dir."/".$dd;
   echo str_repeat('-',count(explode("/",$path))-1);
   if( is_dir ($path) )
   {
    echo '<b>'.$dd.'[sub_dir]</b><br/>';
    buildTree($path);
   }
   else
   {
    echo '-'.$dd.'<br/>';
   }
  }
 }
}

?>
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху