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

Тема в разделе "Как сделать...", создана пользователем MSW, 4 окт 2010.

Статус темы:
Закрыта.
  1. MSW

    MSW

    Регистр.:
    27 авг 2007
    Сообщения:
    491
    Симпатии:
    408
    есть структура, тоесть массив с содержимым:
    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

    может кто-то подскажет?
     
  2. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    интересная задачка. побольше бы таких. реализовал для любого количества вложений.

    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 нравится это.
  3. MSW

    MSW

    Регистр.:
    27 авг 2007
    Сообщения:
    491
    Симпатии:
    408
    diavolic
    спасибо большое, а то я сутки уже с этим мучаюсь :)

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

    MSW

    Регистр.:
    27 авг 2007
    Сообщения:
    491
    Симпатии:
    408
    вот примерно так, но тут получается что не для бесконечной вложености...

    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
    
    
    
     
  5. x8Hive

    x8Hive Постоялец

    Регистр.:
    4 сен 2006
    Сообщения:
    65
    Симпатии:
    3
    Ребята если нужен не ограниченный уровень вложений и при формирования дерева нам не известна его структура тогда проще всего использовать рекурсию, вот набросал пример, рабочий, а дальше уже дело техники:

    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/>';
       }
      }
     }
    }

    ?>
     
Статус темы:
Закрыта.