You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GLOB_ONLYDIR获取目录后,如何排除指定目录bbb与ccc?

解决PHP glob排除指定目录的问题

嘿,我明白你的需求——用GLOB_ONLYDIR拿到目标目录下的所有子目录,但要排除bbb和ccc这两个特定目录对吧?我来给你两种靠谱的解决方案,其中第一种应该是最实用的:

方法一:先获取所有目录,再过滤排除项

这是最直观也最灵活的方式,先通过glob拿到所有子目录,再用array_filter把不需要的目录筛掉:

$root = '/this/is/my/seek/root/';
// 先获取所有子目录
$dirs = glob($root . '*', GLOB_ONLYDIR);

// 定义要排除的目录名数组
$excludeDirs = ['bbb', 'ccc'];

// 过滤目录:保留不在排除列表里的项
$dirs = array_filter($dirs, function($dir) use ($root, $excludeDirs) {
    // 提取目录的最后一级名称(比如从/xxx/bbb拿到bbb)
    $currentDirName = basename($dir);
    return !in_array($currentDirName, $excludeDirs);
});

如果你的PHP版本是7.4及以上,还可以用箭头函数简化代码,看起来更清爽:

$dirs = array_filter($dirs, fn($dir) => !in_array(basename($dir), $excludeDirs));

这个方法的好处是兼容性强、扩展性好——不管后续新增多少子目录,只要维护$excludeDirs数组就行,完全不用修改glob的匹配规则。

关于GLOB_BRACE的误区

你提到想用GLOB_BRACE来实现,但这里要注意:GLOB_BRACE是用来正向匹配多个模式的(比如{aaa,ddd}会匹配aaa和ddd目录),没法直接实现“排除特定目录”的效果。如果硬要尝试,你得把所有需要保留的目录都列出来,但如果目录数量不确定或者经常变动,这种方法就非常不实用了,反而会增加维护成本。

举个例子,假设你只保留aaa和ddd,用GLOB_BRACE会写成这样:

$dirs = glob($root . '{aaa,ddd}', GLOB_ONLYDIR | GLOB_BRACE);

但如果后续新增了eee、fff目录,你就得不断更新这个匹配规则,显然不如方法一省心。

内容的提问来源于stack exchange,提问作者Dwza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:40:56