我正在用 PHP 编写磁盘目录应用程序。我的脚本循环遍历目录,将所有文件名和元数据存储在数据库中。有些目录我不想向下移动。我希望迭代器简单地返回这些目录的名称,就好像它们是文件一样,然后移动到下一个兄弟。我已经实现了一个 RecursiveCallbackFilterIterator,它允许基于匹配的文件名模式省略目录:
$filter = array(".app");
$files = new RecursiveIteratorIterator(
new RecursiveCallbackFilterIterator(
new RecursiveDirectoryIterator(
$zpath,
RecursiveDirectoryIterator::SKIP_DOTS
),
function ($current, $key, $iterator) use ($filter) {
$match = 0;
foreach ($filter as $skip) {
if (substr($current->getBaseName(), -4, 4) == $skip) {
$match = 1;
}
}
if ($match) {
return false;
} else {
return true;
}
}
),
RecursiveIteratorIterator::SELF_FIRST,
RecursiveIteratorIterator::CATCH_GET_CHILD
);
foreach ($files as $splFileInfo) {
$path = $splFileInfo->getRealPath();
echo $path."\n";
}
我的问题是,如何修改此代码,使与模式匹配的目录包含在结果集中,但不返回给迭代器进行进一步遍历?
到目前为止,我发现的所有 RecursiveCallbackFilterIterator 示例都显示了上述内容的一些变化(例如,省略某些文件或目录)。如果它与模式匹配,我只想返回目录名称,然后转到下一个兄弟。
换句话说,我需要转这个:
File1.txt
File2.txt
Folder1/
Folder1/FileA.txt
Folder1/FileB.txt
MyThing.app/
MyThing.app/Contents/
Mything.app/Contents/Manifest.plist
Mything.app/Menu.nib
Portfolio.zip
Zee.txt
进入这个:
File1.txt
File2.txt
Folder1/
Folder1/FileA.txt
Folder1/FileB.txt
MyThing.app
Portfolio.zip
Zee.txt