如何在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
相关产品推荐
相关产品推荐

