Получение папок с помощью PHP glob – неограниченный уровень глубины

У меня есть эта рабочая функция, которая находит папки и создает массив.

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