2013-01-13 13 views
10

Eventuali duplicati:
PHP Get all subdirectories of a given directoryPHP - Listing tutte le directory e sottodirectory in modo ricorsivo nel menu a tendina

Voglio un menu a tendina per mostrare tutte le sottodirectory in ./files/$userid/ non solo la cartella principale. Per esempio: /files/$userid/folder1/folder2/

mio codice attuale è:

HTML:

<select name="myDirs"> 
<option value="" selected="selected">Select a folder</option> 

PHP:

if (chdir("./files/" . $userid)) { 

     $dirs = glob('*', GLOB_ONLYDIR); 
     foreach($dirs as $val){ 
      echo '<option value="'.$val.'">'.$val."</option>\n"; 
     }   
     } else { 
     echo 'Changing directory failed.'; 
} 
+0

E la tua domanda è? Tieni presente che la formulazione dei requisiti non è una domanda di programmazione. Ti suggerisco di cercare prima le tue esigenze sul sito, perché le directory delle liste sono già state poste e hanno risposto in vari modi. [Allora, perché non prendere posto al bar e ordinare la tua bevanda?] (Http://stackoverflow.com/search) – hakre

+0

Avrai bisogno di usare il nativo di PHP [RecursiveDirectoryIterator] (http://php.net/manual/en /class.recursivedirectoryiterator.php) classe. [Questa risposta] (http://stackoverflow.com/a/2398163/427992) dovrebbe aiutare. – hohner

+0

Ho provato questo http://pastebin.com/fpJiiCbZ, ma non funziona. Questo è l'output che ottengo: http://i.imgur.com/gWt3U.png – Brian

risposta

48

RecursiveDirectoryIterator dovrebbe fare il trucco. Purtroppo, la documentazione non è grande, ecco un esempio:

$root = '/etc'; 

$iter = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($root, RecursiveDirectoryIterator::SKIP_DOTS), 
    RecursiveIteratorIterator::SELF_FIRST, 
    RecursiveIteratorIterator::CATCH_GET_CHILD // Ignore "Permission denied" 
); 

$paths = array($root); 
foreach ($iter as $path => $dir) { 
    if ($dir->isDir()) { 
     $paths[] = $path; 
    } 
} 

print_r($paths); 

Questo genera il seguente output sul mio computer:

Array 
(
    [0] => /etc 
    [1] => /etc/rc2.d 
    [2] => /etc/luarocks 
    ... 
    [17] => /etc/php5 
    [18] => /etc/php5/apache2 
    [19] => /etc/php5/apache2/conf.d 
    [20] => /etc/php5/mods-available 
    [21] => /etc/php5/conf.d 
    [22] => /etc/php5/cli 
    [23] => /etc/php5/cli/conf.d 
    [24] => /etc/rc4.d 
    [25] => /etc/minicom 
    [26] => /etc/ufw 
    [27] => /etc/ufw/applications.d 
    ... 
    [391] => /etc/firefox 
    [392] => /etc/firefox/pref 
    [393] => /etc/cron.d 
) 
+0

grazie @PleaseStand funziona bene, solo bisogno di un altro ciclo foreach per la visualizzazione elenco come l'output –

+0

Bello. Sarebbe meglio se fosse possibile illustrare come filtrare le cartelle nascoste e il loro contenuto (come '.svn'). – Raptor

+0

non funziona per me ... solo timeout anche su timeout impostato su un'ora quando il conteggio delle directory è solo 1000 –

3

è possibile utilizzare un'implementazione glob ricorsivo come in questa funzione:

function rglob($pattern='*', $path='', $flags = 0) { 
$paths=glob($path.'*', GLOB_MARK|GLOB_ONLYDIR|GLOB_NOSORT); 
$files=glob($path.$pattern, $flags); 
foreach ($paths as $path) { 
    $files=array_merge($files,rglob($pattern, $path, $flags)); 
} 
return $files; 
} 
+0

@ user183391 che elenca file o cartelle? – Brian

+0

È possibile utilizzare GLOB_ONLYDIR per $ flags argomento – Alex

10

È possibile scrivere il proprio elenco ricorsiva delle directory come:

function expandDirectories($base_dir) { 
     $directories = array(); 
     foreach(scandir($base_dir) as $file) { 
      if($file == '.' || $file == '..') continue; 
      $dir = $base_dir.DIRECTORY_SEPARATOR.$file; 
      if(is_dir($dir)) { 
       $directories []= $dir; 
       $directories = array_merge($directories, expandDirectories($dir)); 
      } 
     } 
     return $directories; 
} 

$directories = expandDirectories(dirname(__FILE__)); 
print_r($directories); 
+2

questa è un'ottima soluzione php senza utilizzare le librerie esterne – Katushai

+0

Confrontando la risposta accettata con questa, terminale: 'time php -f test.php', questo è più veloce. –

Problemi correlati