2012-05-25 8 views
5

Mam drzewo katalogów, podkatalogów i plików (w niektórych, ale nie we wszystkich katalogach). Oto przykład całego drzewa:Skrypt PHP przechodzący przez drzewo katalogów/plików i drzewo wyjściowe w postaci zagnieżdżonych UL

/food 
/food/drinks 
/food/drinks/water.html 
/food/drinks/milk.html 
/food/drinks/soda.html 
/food/entrees 
/food/entrees/hot 
/food/entrees/hot/hamburger.html 
/food/entrees/hot/pizza.html 
/food/entrees/cold 
/food/entrees/cold/icecream.html 
/food/entrees/cold/salad.html 
/cosmetics 
/cosmetics/perfume 
/cosmetics/perfume/chic.html 
/cosmetics/perfume/polo.html 
/cosmetics/perfume/lust.html 
/cosmetics/lipstick 
/cosmetics/lipstick/colors 
/cosmetics/lipstick/colors/red.html 
/cosmetics/lipstick/colors/pink.html 
/cosmetics/lipstick/colors/purple.html 

OK, ze skryptu php w katalogu „/”, chcę recurse lub przemierzać ten drzewo katalogów i wydrukować drzewo takiego:

<ul> 
    <li>food</li> 
    <ul> 
     <li>drinks</li> 
     <ul> 
      <li>water.html</li> 
      <li>milk.html</li> 
      <li>soda.html</li> 
     </ul> 
     <li>entrees</li> 
     <ul> 
      <li>hot</li> 
      <ul> 
       <li>hamburger.html</li> 
       <li>pizza.html</li> 
      </ul> 
      <li>cold</li> 
      <ul> 
       <li>icecream.html</li> 
       <li>salad.html</li> 
      </ul>  
     </ul> 
    </ul> 
    <li>cosmetics</li> 
    <ul> 
     <li>perfume</li> 
     <ul> 
      <li>chic.html</li> 
      <li>polo.html</li> 
      <li>lust.html</li> 
     </ul> 
     <li>lipstick</li> 
     <ul> 
      <li>colors</li> 
      <ul> 
       <li>red.html</li> 
       <li>pink.html</li> 
       <li>purple.html</li> 
      </ul> 
     </ul> 
    </ul> 
</ul> 
+5

Czy próbowałeś to zrobić ?. – Niranjan

+0

Nie mam pojęcia, dlaczego moderatorzy to zamknęli. pytanie jest bardzo jasne. są to 3-4 rozwiązania, niektóre z nich nie zostały jeszcze przedstawione. Odpowiedziałem na coś podobnego tutaj: https://stackoverflow.com/a/48550987/4481831 – eliz82

Odpowiedz

1

Mam nadzieję, że ta funkcja pomoże Ci wykonać pracę.

/* 
    * Retern the file list which include in the given directory 
    * 
    * @param String $dirpath : Path to the directory 
    * 
    * @access public 
    * 
    * @return Array 
    */ 
    function getFileList($dirpath) 
    { 
     $filelist = array(); 
     if ($handle = opendir(dirname ($dirpath))) 
     { 
      while (false !== ($file = readdir($handle))) 
       { 
        $filelist[] = $file; 
       } 
      closedir($handle); 
     } 

     return $filelist; 
    } 
+0

I getFileList ($ _ SERVER ['DOCUMENT_ROOT']. '/ test'), który jest katalogiem głównym, który chcę przejść, a następnie I print_r tablica zwracana, a ja otrzymuję zawartość tylko katalogu $ _SERVER ['DOCUMENT_ROOT']. – user743094

+0

Możesz wywoływać funkcję rekursywnie, dopóki nie otrzymasz żadnych plików. –

6

Na początek, to potrzebne są następujące funkcje do pracy:

  • opendir() uzyskać obsługi katalogów
  • readdir() aby odczytać jego zawartość
  • is_dir() aby określić, czy prąd wartość pobrana z readdir() jest katalogiem lub plikami

Aby przykleić je wszystkie razem, trzeba będzie:

Oto jak to przecież zasoby powyżej są sklejone:

<?php 

function read_dir_content($parent_dir, $depth = 0){ 
    $str_result = ""; 

    $str_result .= "<li>". dirname($parent_dir) ."</li>"; 
    $str_result .= "<ul>"; 
    if ($handle = opendir($parent_dir)) 
    { 
     while (false !== ($file = readdir($handle))) 
     { 
      if(in_array($file, array('.', '..'))) continue; 
      if(is_dir($parent_dir . "/" . $file)){ 
       $str_result .= "<li>" . read_dir_content($parent_dir . "/" . $file, $depth++) . "</li>"; 
      } 
      $str_result .= "<li>{$file}</li>"; 
     } 
     closedir($handle); 
    } 
    $str_result .= "</ul>"; 


    return $str_result; 
} 


echo "<ul>".read_dir_content("d:/movies/")."</ul>"; 
+0

To jedyne rozwiązanie do tej pory, które robi coś podobnego do tego, co chcę, z wyjątkiem, w UL, osadza katalogi nadrzędne w katalogach potomnych w dziwny sposób – user743094

+0

ten kod jest dość prosty. Po prostu zmień kilka linii, a dostaniesz to, czego naprawdę chcesz. Zobacz zaktualizowany kod. – ariefbayu

+0

Ta odpowiedź, podczas gdy część HTML wymaga ulepszenia, aby uzyskać lepszą czytelność. Jest to poprawna odpowiedź na pytanie OP i zasługuje na to, aby została oznaczona jako poprawna! Dziękuję za kod. OT: Kto był kretynem, który faktycznie to zajął? –

8

Co myślę, że trzeba tutaj jest RecursiveDirectoryIterator z PHP Standard Library (SPL)

można następnie napisać coś podobnego do poniższego:

function iterateDirectory($i) 
{ 
    echo '<ul>'; 
    foreach ($i as $path) { 
     if ($path->isDir()) 
     { 
      echo '<li>'; 
      iterateDirectory($path); 
      echo '</li>'; 
     } 
     else 
     { 
      echo '<li>'.$path.'</li>'; 
     } 
    } 
    echo '</ul>'; 
} 

$dir = '/food'; 
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)); 

iterateDirectory($iterator); 
+0

przy użyciu $ dir = $ _SERVER ['DOCUMENT_ROOT']. '/ Test'; jako mój katalog początkowy ... Nic mi nie daje. – user743094

+0

Tak, widzę problem. Definiowałem typ dla $ i w funkcji iterateDirectory, która rzuca wyjątek. Wypróbuj teraz i zobacz jak się masz – hobnob

+0

Ten skrypt nie generuje przykładu html, podanego w pytaniu OP. Kod nie pokazuje folderów ... A kolejność ul do li do ul na li jest bardzo pomieszana. –

2

używam tego, aby wszystkie pliki w katalogu:

function tree($path, $exclude = array()) { 
    $files = array(); 
    foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $splfileinfo) { 
     if (!in_array(basename($splfileinfo), $exclude)) { 
      $files[] = str_replace($path, '', '' . $splfileinfo); 
     } 
    } 
    return $files; 
}