PHP遍历目录过滤指定项实现文件隐藏的写法是否正确?
PHP目录过滤代码优化建议
你的核心实现思路完全正确:遍历目录项、排除指定条目后存入结果数组,完全可以实现隐藏指定文件/文件夹的效果。只是现有代码存在可维护性差、冗余开销的问题,调整后会更规范。
现有代码的问题
- 多层嵌套
if的写法可读性极差,后续如果新增要排除的条目,需要再加一层嵌套,维护成本很高 - 存储排除条目的数组放在循环内部,每遍历一个目录项就会重新创建一次数组,存在无意义的性能损耗
- 没有处理
readdir()遍历默认返回的.(当前目录)、..(上级目录)两个特殊条目,这两个值会被误存入结果数组
优化后的基础写法
直接用PHP内置的in_array()函数判断条目是否在排除列表中,不需要多层嵌套,同时把排除列表定义移到循环外部:
// 提前定义所有需要隐藏/排除的条目,包含默认特殊目录 $excludeList = [ "index.php", "style.css", "sorttable.js", "host-img", ".", ".." ]; $dirArray = []; while($entryName = readdir($myDirectory)) { // 不在排除列表中的条目才存入结果数组 if (!in_array($entryName, $excludeList)) { $dirArray[] = $entryName; } }
面向对象封装写法(适配你当前学习类用法的练习目标)
可以把目录过滤逻辑封装成独立类,拆分逻辑职责,后续复用也更方便:
class DirectoryFilter { // 类内部维护默认排除的特殊目录 protected array $defaultExclude = [".", ".."]; // 合并后实际生效的排除列表 protected array $finalExclude; /** * 初始化时支持传入自定义要排除的文件/文件夹 */ public function __construct(array $customExclude = []) { $this->finalExclude = array_merge($this->defaultExclude, $customExclude); } /** * 传入打开的目录句柄,返回过滤完成的目录项数组 */ public function filter($directoryHandle): array { $result = []; while ($entry = readdir($directoryHandle)) { if (!in_array($entry, $this->finalExclude)) { $result[] = $entry; } } return $result; } } // 调用示例 $filter = new DirectoryFilter([ "index.php", "style.css", "sorttable.js", "host-img" ]); $dirArray = $filter->filter($myDirectory);
小提示:如果你的PHP版本≥8.0,
in_array可以传第三个参数true开启严格类型校验,避免隐式类型转换带来的判断误差。
内容的提问来源于stack exchange,提问作者Sam Mulla
相关产品推荐
相关产品推荐

