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

如何在PHP中使用GLOB_ONLYDIR排除指定目录?

解决glob筛选目录时排除指定目录的问题

嘿,我之前也碰到过类似的需求,咱们来一步步搞定它~

首先,你原来的代码已经能正确获取目标根目录下的所有子目录了:

$root = '/this/is/my/seek/root/';
$dirs = glob($root . '*', GLOB_ONLYDIR);

要排除bbb和ccc这两个目录,最直接且灵活的方法是用array_filter对glob返回的结果做二次过滤,具体代码如下:

$root = '/this/is/my/seek/root/';
// 定义需要排除的目录名数组
$excludeDirs = ['bbb', 'ccc'];

// 先获取所有子目录
$allDirs = glob($root . '*', GLOB_ONLYDIR);

// 过滤掉需要排除的目录
$filteredDirs = array_filter($allDirs, function($dirPath) use ($root, $excludeDirs) {
    // 提取目录的最后一级名称(比如从/this/is/my/seek/root/aaa里取出aaa)
    $dirName = basename($dirPath);
    // 如果目录名不在排除列表里,就保留它
    return !in_array($dirName, $excludeDirs);
});

为什么推荐这种方法?

  • 灵活性高:不管后续根目录下新增多少子目录,只要维护$excludeDirs数组就行,不用修改匹配逻辑
  • 逻辑清晰:先拿全量目录再过滤,比复杂的glob模式更容易调试和维护

你提到考虑过GLOB_BRACE标志,其实用它也能实现,但局限性很大——它只能匹配明确指定的目录,比如:

// 这种写法只能拿到aaa和ddd目录,如果新增了其他目录,就得手动加到括号里
$dirs = glob($root . '{aaa,ddd}', GLOB_ONLYDIR | GLOB_BRACE);

这种方法只适合你明确知道所有需要保留的目录且不会新增的场景,显然不如array_filter通用。

内容的提问来源于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:39:09