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.';
}
3 ответов
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;
}