PHP получает все подкаталоги данного каталога
Как я могу получить все подкаталоги данного каталога без файлы .
(текущий каталог) или ..
(родительский каталог)
а затем использовать каждый каталог в функции?
16 ответов:
можно использовать glob () С
GLOB_ONLYDIR
опцииили
$dirs = array_filter(glob('*'), 'is_dir'); print_r( $dirs);
вот как вы можете получить только каталоги с GLOB:
$directories = glob($somePath . '/*' , GLOB_ONLYDIR);
Spl DirectoryIterator класс обеспечивает простой интерфейс для просмотра содержимого каталогов файловой системы.
$dir = new DirectoryIterator($path); foreach ($dir as $fileinfo) { if ($fileinfo->isDir() && !$fileinfo->isDot()) { echo $fileinfo->getFilename().'<br>'; } }
почти так же, как в вашем предыдущий вопрос:
$iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($yourStartingPath), RecursiveIteratorIterator::SELF_FIRST); foreach($iterator as $file) { if($file->isDir()) { echo strtoupper($file->getRealpath()), PHP_EOL; } }
заменить
strtoupper
с нужной вам функцией.
попробуйте этот код:
<?php $path = '/var/www/html/project/somefolder'; $dirs = array(); // directory handle $dir = dir($path); while (false !== ($entry = $dir->read())) { if ($entry != '.' && $entry != '..') { if (is_dir($path . '/' .$entry)) { $dirs[] = $entry; } } } echo "<pre>"; print_r($dirs); exit;
В Наборе:
function expandDirectoriesMatrix($base_dir, $level = 0) { $directories = array(); foreach(scandir($base_dir) as $file) { if($file == '.' || $file == '..') continue; $dir = $base_dir.DIRECTORY_SEPARATOR.$file; if(is_dir($dir)) { $directories[]= array( 'level' => $level 'name' => $file, 'path' => $dir, 'children' => expandDirectoriesMatrix($dir, $level +1) ); } } return $directories; }
//доступа:
$dir = '/var/www/'; $directories = expandDirectoriesMatrix($dir); echo $directories[0]['level'] // 0 echo $directories[0]['name'] // pathA echo $directories[0]['path'] // /var/www/pathA echo $directories[0]['children'][0]['name'] // subPathA1 echo $directories[0]['children'][0]['level'] // 1 echo $directories[0]['children'][1]['name'] // subPathA2 echo $directories[0]['children'][1]['level'] // 1
пример, чтобы показать все:
function showDirectories($list, $parent = array()) { foreach ($list as $directory){ $parent_name = count($parent) ? " parent: ({$parent['name']}" : ''; $prefix = str_repeat('-', $directory['level']); echo "$prefix {$directory['name']} $parent_name <br/>"; // <----------- if(count($directory['children'])){ // list the children directories showDirectories($directory['children'], $directory); } } } showDirectories($directories); // pathA // - subPathA1 (parent: pathA) // -- subsubPathA11 (parent: subPathA1) // - subPathA2 // pathB // pathC
надлежащим образом
/** * Get all of the directories within a given directory. * * @param string $directory * @return array */ function directories($directory) { $glob = glob($directory . '/*'); if($glob === false) { return array(); } return array_filter($glob, function($dir) { return is_dir($dir); }); }
вдохновленный Laravel
<?php /*this will do what you asked for, it only returns the subdirectory names in a given path, and you can make hyperlinks and use them: */ $yourStartingPath = "photos\"; $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($yourStartingPath), RecursiveIteratorIterator::SELF_FIRST); foreach($iterator as $file) { if($file->isDir()) { $path = strtoupper($file->getRealpath()) ; $path2 = PHP_EOL; $path3 = $path.$path2; $result = end(explode('/', $path3)); echo "<br />". basename($result ); } } /* best regards, Sanaan Barzinji Erbil */ ?>
вы можете попробовать эту функцию (требуется PHP 7)
function getDirectories(string $path) : array { $directories = []; $items = scandir($path); foreach ($items as $item) { if($item == '..' || $item == '.') continue; if(is_dir($path.'/'.$item)) $directories[] = $item; } return $directories; }
для этого можно использовать функцию glob ().
вот некоторые документы по нему: http://php.net/manual/en/function.glob.php
найти все PHP файлы рекурсивно. Логика должна быть достаточно простой, чтобы настроить, и она стремится быть быстрой(er), избегая вызовов функций.
function get_all_php_files($directory) { $directory_stack = array($directory); $ignored_filename = array( '.git' => true, '.svn' => true, '.hg' => true, 'index.php' => true, ); $file_list = array(); while ($directory_stack) { $current_directory = array_shift($directory_stack); $files = scandir($current_directory); foreach ($files as $filename) { // Skip all files/directories with: // - A starting '.' // - A starting '_' // - Ignore 'index.php' files $pathname = $current_directory . DIRECTORY_SEPARATOR . $filename; if (isset($filename[0]) && ( $filename[0] === '.' || $filename[0] === '_' || isset($ignored_filename[$filename]) )) { continue; } else if (is_dir($pathname) === TRUE) { $directory_stack[] = $pathname; } else if (pathinfo($pathname, PATHINFO_EXTENSION) === 'php') { $file_list[] = $pathname; } } } return $file_list; }
Если вы ищете рекурсивный каталог листинга решений. Используйте ниже код я надеюсь, что это должно помочь вам.
<?php /** * Function for recursive directory file list search as an array. * * @param mixed $dir Main Directory Path. * * @return array */ function listFolderFiles($dir) { $fileInfo = scandir($dir); $allFileLists = []; foreach ($fileInfo as $folder) { if ($folder !== '.' && $folder !== '..') { if (is_dir($dir . DIRECTORY_SEPARATOR . $folder) === true) { $allFileLists[$folder . '/'] = listFolderFiles($dir . DIRECTORY_SEPARATOR . $folder); } else { $allFileLists[$folder] = $folder; } } } return $allFileLists; }//end listFolderFiles() $dir = listFolderFiles('your searching directory path ex:-F:\xampp\htdocs\abc'); echo '<pre>'; print_r($dir); echo '</pre>' ?>
для людей, которые на самом деле хотят папки и подпапки без файлов, так же, как сказал OP, следующий код выводит как список папок и их подпапок, так и массив из них.
<?php /** * Function for recursive directory file list search as an array. * * @param mixed $dir Main Directory Path. * * @return array */ function listFolderFiles($dir) { $fileInfo = scandir($dir); $allFileLists = []; foreach ($fileInfo as $folder) { if ($folder !== '.' && $folder !== '..') { if (is_dir($dir . DIRECTORY_SEPARATOR . $folder) === true) { $allFileLists[$folder . '/'] = listFolderFiles($dir . DIRECTORY_SEPARATOR . $folder); echo ' '. $folder. ' ' <br>'; } else { echo' '; } } } return $allFileLists; }//end listFolderFiles() listFolderFiles('C:\wamp64\www\code'); $dir = listFolderFiles('C:\wamp64\www\code'); echo '<pre>'; print_r($dir); echo '</pre>' ?>
Я написал сканер, который работает очень хорошо и сканирует каталоги и подкаталоги в каждом каталоге и файлах.
function scanner($path){ $result = []; $scan = glob($path . '/*'); foreach($scan as $item){ if(is_dir($item)) $result[basename($item)] = scanner($item); else $result[] = basename($item); } return $result; }
пример
var_dump(scanner($path));
возвращает:
array(6) { ["about"]=> array(2) { ["factory"]=> array(0) { } ["persons"]=> array(0) { } } ["contact"]=> array(0) { } ["home"]=> array(1) { [0]=> string(5) "index.php" } ["projects"]=> array(0) { } ["researches"]=> array(0) { } [0]=> string(5) "index.php" }
следующая рекурсивная функция возвращает массив с полным списком подкаталогов
function getSubDirectories($dir) { $subDir = array(); $directories = array_filter(glob($dir), 'is_dir'); $subDir = array_merge($subDir, $directories); foreach ($directories as $directory) $subDir = array_merge($subDir, getSubDirectories($directory.'/*')); return $subDir; }
Источник:https://www.lucidar.me/en/web-dev/how-to-get-subdirectories-in-php/
найти все файлы и папки в указанной директории.
function getAllSubdir($dir, &$fullDir = []) { $currentDir = scandir($dir); foreach ($currentDir as $key => $val) { $realpath = realpath($dir . DIRECTORY_SEPARATOR . $val); if (!is_dir($realpath) && $filename != "." && $filename != "..") { getDirRecursive($realpath, $fullDir); $fullDir[] = $realpath; } } return $fullDir; } var_dump(scanDirAndSubdir('C:/web2.0/'));
пример :
array (size=4) 0 => string 'C:/web2.0/config/' (length=17) 1 => string 'C:/web2.0/js/' (length=13) 2 => string 'C:/web2.0/mydir/' (length=16) 3 => string 'C:/web2.0/myfile/' (length=17)