使用glob返回给定目录中的文件夹列表(没有路径)

时间:2009-12-15 15:40:13

标签: php

以下函数将给定目录中的所有文件夹返回到多个级别。

我只需要一个级别的深度,只是目标目录中的文件夹,没有子文件夹。

此函数还返回文件夹的完整路径,我只想要文件夹名称。我确定我错过了一些简单的事情。

如何修改函数以仅返回给定目录的文件夹名称? (不是每个文件夹的完整路径)

$ myArray = get_dirs('../ wp-content / themes / mytheme / images');

<?php
  function get_dirs( $path = '.' ){
    return glob( 
      '{' . 
        $path . '/*,'    . # Current Dir
        $path . '/*/*,'  . # One Level Down
        $path . '/*/*/*' . # Two Levels Down, etc.
      '}', GLOB_BRACE + GLOB_ONLYDIR );
  }
?>
不过,感谢Doug提供的原始功能帮助!

2 个答案:

答案 0 :(得分:5)

我建议不要使用glob(),而是使用DirectoryIterator类。

function get_dirs($path = '.') {
    $dirs = array();

    foreach (new DirectoryIterator($path) as $file) {
        if ($file->isDir() && !$file->isDot()) {
            $dirs[] = $file->getFilename();
        }
    }

    return $dirs;
}

答案 1 :(得分:0)

如果您只想要当前文件夹名称并且返回一个平面数组,您可以extend一个RecursiveFilterIterator并在检查是否要{{1}时在RunTime期间收集一个堆栈它。在accept()方法中,您当然会跳过没有附加子迭代器的所有内容,因此您不必不必要地遍历不需要的部分。

accept()

这样可以很容易地定义您想要的回报。 class DirectoryStackIterator extends RecursiveFilterIterator { public static $stack = []; public function __construct( FilesystemIterator $iterator ) { parent::__construct( $iterator ); } public function getStack() { return self::$stack; } public function accept() { if ( $this->hasChildren() ) { foreach ( $this->getChildren() as $c ) { $dir = basename( $c->getPath() ); $c->isDir() && ! in_array( $dir, self::$stack ) AND self::$stack[] = $dir; } } return $this->hasChildren(); } } $c的一个实例,所以只需参考它。

SPLFileInfo

然后我们附加$iterator = new DirectoryStackIterator( new RecursiveDirectoryIterator( __DIR__, FilesystemIterator::FOLLOW_SYMLINKS | FilesystemIterator::SKIP_DOTS ) ); (扩展RecursiveDirectoryIterator,然后扩展FilesystemIterator - 以查看您获得的方法)和DirectoryIterator,但请遵循符号链接。如果您不想要,请删除后一个。

最后,我们只是遍历迭代器迭代器而不实际执行任何操作。请记住,最后使用分号(SKIP_DOTS)不会在每次事故中触发下一行的任何内容。

;

收集我们的自定义堆栈非常简单:

foreach ( $iterator as $dir );