PHP. Рекурсивно перечислять все каталоги и подкаталоги в выпадающем меню

Возможный дубликат:
PHP Получить все подкаталоги данного каталога

Я хочу, чтобы выпадающее меню отображало все подкаталоги в ./files/$userid/ не только в основной папке. Например: /files/$userid/folder1/folder2/

Мой текущий код:

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

RecursiveDirectoryIterator должен сделать трюк. К сожалению, документация невелика, вот пример:

 $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); 

На этом компьютере генерируется следующий вывод:

 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 ) 

Вы можете написать собственный рекурсивный список каталогов, например:

 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); 

Вы можете использовать рекурсивную реализацию glob, как в этой функции:

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