以下函数将给定目录中的所有文件夹返回到多个级别。
我只需要一个级别的深度,只是目标目录中的文件夹,没有子文件夹。
此函数还返回文件夹的完整路径,我只想要文件夹名称。我确定我错过了一些简单的事情。
如何修改函数以仅返回给定目录的文件夹名称? (不是每个文件夹的完整路径)
$ 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提供的原始功能帮助!
答案 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 );