Как я могу получить все подкаталоги данного каталога без файлов .
(текущий каталог) или ..
(родительский каталог), а затем использовать каждый каталог в функции?
php
list
get
subdirectory
Адриан М.
источник
источник
Вот как вы можете получить только каталоги с помощью GLOB:
$directories = glob($somePath . '/*' , GLOB_ONLYDIR);
источник
$somePath
в выходных данныхКласс 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
желаемой функцией.источник
getFilename()
вернет только имя каталога.RecursiveDirectoryIterator::SKIP_DOTS
в конструктор второй аргументRecursiveDirectoryIterator
.Попробуйте этот код:
<?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
источник
<?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; }
источник
Надлежащим образом
/** * 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
источник
GLOB_ONLYDIR
, см. Php.net/manual/en/function.glob.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/
источник
Это однострочный код:
$sub_directories = array_map('basename', glob($directory_path . '/*', GLOB_ONLYDIR));
источник
Безрекурсивный список только каталогов
Единственный вопрос, который задал direct , был закрыт по ошибке, поэтому я должен задать его здесь.
Это также дает возможность фильтровать каталоги.
/** * Copyright © 2020 Theodore R. Smith <https://www.phpexperts.pro/> * License: MIT * * @see https://stackoverflow.com/a/61168906/430062 * * @param string $path * @param bool $recursive Default: false * @param array $filtered Default: [., ..] * @return array */ function getDirs($path, $recursive = false, array $filtered = []) { if (!is_dir($path)) { throw new RuntimeException("$path does not exist."); } $filtered += ['.', '..']; $dirs = []; $d = dir($path); while (($entry = $d->read()) !== false) { if (is_dir("$path/$entry") && !in_array($entry, $filtered)) { $dirs[] = $entry; if ($recursive) { $newDirs = getDirs("$path/$entry"); foreach ($newDirs as $newDir) { $dirs[] = "$entry/$newDir"; } } } } return $dirs; }
источник
Для этого вы можете использовать функцию glob ().
Вот некоторая документация по нему: http://php.net/manual/en/function.glob.php
источник
Рекурсивный поиск всех файлов PHP. Логика должна быть достаточно простой, чтобы ее можно было настроить, и она должна быть быстрой (э-э), избегая вызовов функций.
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>' ?>
источник
Найдите все файлы и папки в указанном каталоге.
function scanDirAndSubdir($dir, &$fullDir = array()){ $currentDir = scandir($dir); foreach ($currentDir as $key => $val) { $realpath = realpath($dir . DIRECTORY_SEPARATOR . $val); if (!is_dir($realpath) && $filename != "." && $filename != "..") { scanDirAndSubdir($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)
источник