2010-06-23 6 views
2

J'essaie d'utiliser scandir pour afficher une liste de dossiers listés dans un répertoire spécifique (qui fonctionne bien). Cependant, j'en ai besoin pour ajouter les dossiers enfants (s'il y en a) dans ma liste de sélection. Si quelqu'un pouvait m'aider, ce serait génial!Utiliser php pour créer une liste de sélection de dossier - y compris les dossiers enfants?

C'est la structure que je veux:

<option>folder 1</option> 
<option> --child 1</option> 
<option> folder 2</option> 
<option> folder 3</option> 
<option> --child 1</option> 
<option> --child 2</option> 
<option> --child 3</option> 

Et c'est le code que j'ai (ce qui montre que les dossiers parents) que je suis de ce fil (Using scandir() to find folders in a directory (PHP)):

$dir = $_SERVER['DOCUMENT_ROOT']."\\folder\\"; 

$path = $dir; 
$results = scandir($path); 

$folders = array(); 
foreach ($results as $result) { 
    if ($result == '.' || $result == '..') continue; 
    if (is_dir($path . '/' . $result)) { 
     $folders[] = $result; 
    }; 
}; 

^^ mais j'en ai besoin pour montrer aussi les répertoires enfants. Si quelqu'un pouvait aider, ce serait génial! :)

EDIT: Vous avez oublié de dire que je ne veux pas les fichiers, seuls les dossiers ..

+0

de les parcourir récursivement. – Andrey

Répondre

2
/* FUNCTION: showDir 
* DESCRIPTION: Creates a list options from all files, folders, and recursivly 
*  found files and subfolders. Echos all the options as they are retrieved 
* EXAMPLE: showDir(".") */ 
function showDir($dir , $subdir = 0) { 
    if (!is_dir($dir)) { return false; } 

    $scan = scandir($dir); 

    foreach($scan as $key => $val) { 
     if ($val[0] == ".") { continue; } 

     if (is_dir($dir . "/" . $val)) { 
      echo "<option>" . str_repeat("--", $subdir) . $val . "</option>\n"; 

      if ($val[0] !=".") { 
       showDir($dir . "/" . $val , $subdir + 1); 
      } 
     } 
    } 

    return true; 
} 
+0

merci pour cela, mais il montre aussi des fichiers - je veux seulement les dossiers eux-mêmes :) – SoulieBaby

+0

Ahh, je l'ai réparé pour vous :) Si vous en avez besoin pour afficher le. et .., ajoutez les lignes suivantes après $ scan = scandir: if ($ subdir == 0) { echo ""; } – abelito

+0

merci encore, mais maintenant il ne montre rien :( – SoulieBaby

6
//Requires PHP 5.3 
$it = new RecursiveTreeIterator(
    new RecursiveDirectoryIterator($dir)); 

foreach ($it as $k => $v) { 
    echo "<option>".htmlspecialchars($v)."</option>\n"; 
} 

Vous pouvez personnaliser le préfixe avec RecursiveTreeIterator::setPrefixPart.

0

Vous pouvez utiliser la fonction PHP « glob » http://php.net/manual/en/function.glob.php et construire une fonction récursive (une fonction qui s'appeler) pour aller profondeur de niveau infini. Il est plus court puis en utilisant "scandir"

function glob_dir_recursive($dirs, $depth=0) { 
    foreach ($dirs as $item) { 
     echo '<option>' . str_repeat('-',$depth*1) . basename($item) . '</option>'; //can use also "basename($item)" or "realpath($item)" 
     $subdir = glob($item . DIRECTORY_SEPARATOR . '*', GLOB_ONLYDIR); //use DIRECTORY_SEPARATOR to be OS independent 
     if (!empty($subdir)) { //if subdir array is not empty make function recursive 
      glob_dir_recursive($subdir, $depth+1); //execute the function again with current subdir, increment depth 
     } 
    } 
} 

Utilisation:

$dirs = array('galleries'); //relative path examples: 'galleries' or '../galleries' or 'galleries/subfolder'. 
//$dirs = array($_SERVER['DOCUMENT_ROOT'].'/galleries'); //absolute path example 
//$dirs = array('galleries', $_SERVER['DOCUMENT_ROOT'].'/logs'); //multiple paths example 

echo '<select>'; 
glob_dir_recursive($dirs); //to list directories and files 
echo '</select>'; 

Cela va générer exactement le type de sortie demandée.

Questions connexes