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

Adr*_* M. 130 php get list subdirectory

如何在没有文件.(当前目录)或..(父目录)的情况下获取给定目录的所有子目录,然后使用函数中的每个目录?

gho*_*g74 199

你可以使用glob()GLOB_ONLYDIR选项

要么

$dirs = array_filter(glob('*'), 'is_dir');
print_r( $dirs);
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是一个很好的,简单的方法,但是接受的答案并没有回答这个问题:从父目录(也就是当前工作目录的兄弟)获取子目录.为此,需要将工作目录更改为父目录. (6认同)
  • @developerbmw注意单词**或**.他介绍了实现目标的两种不同方法. (3认同)
  • 你必须在这里进行一次复苏 (2认同)
  • 这会忽略以点开头的目录,即。“.config” (2认同)

Cor*_*eus 144

以下是如何使用GLOB仅检索目录:

$directories = glob($somePath . '/*' , GLOB_ONLYDIR);
Run Code Online (Sandbox Code Playgroud)

  • 这不包括我的主目录(Windows) (3认同)
  • 这还包括主目录. (2认同)
  • 这也不包括我在 mac linux 上的主目录。也许这与使用的路径有关? (2认同)

stl*_*loc 37

Spl DirectoryIterator类提供了一个用于查看文件系统目录内容的简单界面.

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


Gor*_*don 25

上一个问题几乎相同:

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

foreach($iterator as $file) {
    if($file->isDir()) {
        echo strtoupper($file->getRealpath()), PHP_EOL;
    }
}
Run Code Online (Sandbox Code Playgroud)

替换strtoupper为您想要的功能.

  • +1.这是真正面向未来的方式. (2认同)

Ric*_*las 7

在数组中:

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;
}
Run Code Online (Sandbox Code Playgroud)

//使用权:

$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
Run Code Online (Sandbox Code Playgroud)

显示所有示例:

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
Run Code Online (Sandbox Code Playgroud)


小智 5

试试这段代码:

<?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;
Run Code Online (Sandbox Code Playgroud)