У меня есть эта рабочая функция, которая находит папки и создает массив.
function dua_get_files($path) { foreach (glob($path . "/*", GLOB_ONLYDIR) as $filename) { $dir_paths[] = $filename; } return $dir_paths; }
Эта функция может находить только каталоги в текущем местоположении. Я хочу найти пути к каталогам в дочерних папках и их дочерних элементах и так далее.
Массив все равно должен быть плоским списком путей к каталогам.
Пример того, как должен выглядеть выходной массив
$dir_path[0] = 'path/folder1'; $dir_path[1] = 'path/folder1/child_folder1'; $dir_path[2] = 'path/folder1/child_folder2'; $dir_path[3] = 'path/folder2'; $dir_path[4] = 'path/folder2/child_folder1'; $dir_path[5] = 'path/folder2/child_folder2'; $dir_path[6] = 'path/folder2/child_folder3';
Если вы хотите рекурсивно работать над каталогами, вы должны взглянуть на RecursiveDirectoryIterator
.
$path = realpath('/etc'); $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST); foreach($objects as $name => $object){ echo "$name\n"; }
Попробуйте это вместо этого:
function dua_get_files($path) { $data = array(); $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST); foreach ($files as $file) { if (is_dir($file) === true) { $data[] = strval($file); } } return $data; }
Очень странно – решают все рекомендации, но лучше всего цикл:
$dir ='/dir'; while($dirs = glob($dir . '/*', GLOB_ONLYDIR)) { $dir .= '/*'; if(!$result) { $result = $dirs; } else { $result = array_merge($result, $dirs); } }
Используйте эту функцию:
function dua_get_files($path) { $dir_paths = array(); foreach (glob($path . "/*", GLOB_ONLYDIR) as $filename) { $dir_paths[] = $filename; $a = glob("$filename/*", GLOB_ONLYDIR); if( is_array( $a ) ) { $b = dua_get_files( "$filename/*" ); foreach( $b as $c ) { $dir_paths[] = $c; } } } return $dir_paths; }
Если вы работаете в linux / unix, вы также можете использовать обратные ссылки с помощью команды find
. Поиск каталогов в файловой системе может занять много времени и нажать на петлю – команда find
системы уже построена для скорости и обрабатывает петли файловой системы. Другими словами, вызов системного exec, вероятно, будет стоить гораздо меньше времени процессора, чем использование самого php для поиска в дереве файловой системы.
$dirs = `find $path -type d`;
Не забудьте очистить вход $ path, так что другие пользователи не передают в себе права на компрометацию имен путей (например, из URL-адреса или чего-то еще).
Поместить его в массив
$dirs = preg_split("/\s*\n+\s*/",`find $path -type d`,-1,PREG_SPLIT_NO_EMPTY);