使用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
相关产品推荐
相关产品推荐

