2010-11-17 26 views
5

J'essaie d'obtenir une liste avec des dossiers et des sous-dossiers que j'ai ce qui suit me permet d'obtenir les dossiers et sous-dossiers, mais j'avais besoin d'être triés comme par exemple ci-dessous j'ai essayé mais je ne sais pas comment je me déplacerais.comment afficher les dossiers et sous-dossiers de dir dans PHP

Root/ 
Root/Images 
Root/Images/UserImages 

Root/Text/ 
Root/Text/User1/ 
Root/Text/User1/Folder2 

mais au monent son écran comme celui-ci

Root/css/ 
tree/css/ 
js/ 
images/ 

PHP CODE:

function ListFolder($path) 
{ 

    $dir_handle = @opendir($path) or die("Unable to open $path"); 

    //Leave only the lastest folder name 
    $dirname = end(explode("/", $path)); 

    //display the target folder. 
    echo ("$dirname/"); 
    while (false !== ($file = readdir($dir_handle))) 
    { 
     if($file!="." && $file!="..") 
     { 
      if (is_dir($path."/".$file)) 
      { 
       //Display a list of sub folders. 
       ListFolder($path."/".$file); 
       echo "<br>"; 
      } 
     } 
    } 


    //closing the directory 
    closedir($dir_handle); 
} 

    ListFolder("../"); 

Merci

+1

en double possible d'au moins [PHP SPL RecursiveDirectoryIterator RecursiveIteratorIterator récupérer l'arbre complet] (http: //stackoverflow.com/questions/2418068/php-spl-recursivedirectoryiterator-recursiveiteratoriteratorator-retrieving-the-full) – Gordon

Répondre

3

recueillir les noms de répertoire dans un tableau au lieu de echo les directement. Utilisez sort sur la matrice et un foreach -loop pour imprimer la liste.

Donc, au lieu de echo ("$dirname/");, vous utiliseriez $dirnames[] = $dirname; (rendez $ globaux et initialisez-le avant votre premier appel de "ListFolder"). Puis, après la course récursive de « ListFolder », vous voulez exécuter sort($dirnames); puis quelque chose comme ça pour la sortie:

foreach ($dirnames as $dirname) 
{ 
    echo $dirname . '<br />'; 
} 
1

vous pouvez achive ce que vous voulez avec le DirectoryIterator ou mieux la RecursiveDirectoryIterator du php SPL.

ici est un exemple rapide sur la façon d'utiliser:

$dir = '/path/to/directory'; 
    $result = array(); 

    if (is_dir($dir)) { 
      $iterator = new RecursiveDirectoryIterator($dir); 
      foreach (new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST) as $file) {      
       if (!$file->isFile()) { 
        $result[] = 'path: ' . $file->getPath(). ', filename: ' . $file->getFilename(); 
       } 
      } 

    } 

Cela devrait faire l'affaire. Bonne chance;)

+0

Il serait (probablement) préférable d'ignorer 'is_dir()' et de récupérer le 'UnexpectedValueException' lancé par' RecursiveDirectoryIterator' si '$ dir' n'est pas un répertoire; ce dernier va vérifier pour le répertoire de toute façon. Vous pouvez aussi envelopper les itérateurs dans un ParentIterator, pour ne lister que les répertoires, et renoncer à la condition 'isFile()'. – salathe

+0

oui, vous avez raison, je pourrais et je devrais le faire, mais ici j'essayais juste de lui montrer un exemple rapide. Merci! – misterjinx

1

avec ce code, vous obtiendrez la liste des sous-répertoires (mais définissez votre foldername)

<?php 
$path = realpath('yourfolder/examplefolder'); 
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) 
{ 
     echo "$filename\n"; 
} 
?>