所以我试图使用GlobIterator
来统一一些文件参数处理。 (使用Iterator进行对称,并将RecursiveDirectoryIterator
用于其他列表参数。)
但它具有当前目录的文件规范的特性:
$dir = new GlobIterator("*.php");
这会在键和/
条目名称之前添加FileObject
斜杠。
[pathName:SplFileInfo:private] => /index.php
[fileName:SplFileInfo:private] => /index.php
使用它作为文件名迭代器不太有用。
因此GlobIterator
不仅仅是Iterator中包含的1:1 glob()
替换,如手册所示。 (1)但是为什么/
会先加上?{1}}? (2)哪个标志会禁用此重写? FilesystemIterator::CURRENT_AS_FILEINFO
是我的第一个假设,但没有帮助,::KEY_AS_PATHNAME
。还有其他旗帜吗? (简洁手册和所有)
答案 0 :(得分:1)
可以输出没有前导斜杠的文件名,如下所示:
<?php
$iterator = new GlobIterator("*.php");
$iterator->setFlags(FilesystemIterator::KEY_AS_FILENAME);
echo "Key as Filename:\n";
foreach ($iterator as $key => $fileinfo) {
echo $key . "\n";
}
?>
输出:
Key as Filename:
apple.jpg
banana.jpg
example.php
GlobIterator延伸FilesystemIterator。 setFlags()的适用常量很好documented。
答案 1 :(得分:0)
正如古老的中国谚语所说,如果你想要一个给你一个类似于glob()
的输出的迭代器,那么只需使用一个frigging迭代器而不是glob。
所以我只是诉诸于此:
$list = [
new ArrayIterator(glob("*.php")),
new ArrayIterator(glob("whatevers/*.php")),
new RII(RecursiveDirectoryIterator("more")),
]
这给出了预期的统一文件名列表,没有{app}逻辑内的(strstr($glob,"/") ? "$glob" : "./$glob")
包装或键/值探测。