PHP 获取给定目录的所有子目录

我怎样才能得到一个给定目录的所有子目录没有文件,.(工作目录)或 ..(父目录) 然后在函数中使用每个目录?

247552 次浏览

选择1:

可以将 glob()GLOB_ONLYDIR选项一起使用。

选择2:

另一种选择是使用 array_filter筛选目录列表。但是,请注意,下面的代码将跳过名称中带有句点的有效目录,如 .config

$dirs = array_filter(glob('*'), 'is_dir');
print_r($dirs);

几乎和你的 上一个问题一样:

$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($yourStartingPath),
RecursiveIteratorIterator::SELF_FIRST);


foreach($iterator as $file) {
if($file->isDir()) {
echo strtoupper($file->getRealpath()), PHP_EOL;
}
}

用所需的函数替换 strtoupper

以下是使用 GLOB 只检索目录的方法:

$directories = glob($somePath . '/*' , GLOB_ONLYDIR);
<?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
*/
?>

Spl 导演迭代器类提供了一个查看文件系统目录内容的简单接口。

$dir = new DirectoryIterator($path);
foreach ($dir as $fileinfo) {
if ($fileinfo->isDir() && !$fileinfo->isDot()) {
echo $fileinfo->getFilename().'<br>';
}
}

您可以使用 glob()函数来完成这项工作。

这里有一些关于它的文档: Http://php.net/manual/en/function.glob.php

查找指定目录下的所有子文件夹。

<?php
function scanDirAndSubdir($dir, &$fullDir = array()){
$currentDir = scandir($dir);


foreach ($currentDir as $key => $filename) {
$realpath = realpath($dir . DIRECTORY_SEPARATOR . $filename);
if (!is_dir($realpath) && $filename != "." && $filename != "..") {
scanDirAndSubdir($realpath, $fullDir);
} else {
$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)

试试这个代码:

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

正确的方式

/**
* 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 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;
}

递归地查找所有 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;
}

数组:

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

非递归仅列出目录

唯一的问题是 直接问这个被错误地关闭了,所以我必须把它放在这里。

它还提供了过滤目录的能力。

/**
* 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;
}