我正在尝试使用GlobIterator class.
我使用的是与glob function中相同的PATTERN,但是GlobIterator会生成一个空数组.
例:
$glob = glob('./*');
print_r($glob);
将为我提供当前目录中所有文件的数组.
但是当我这样做
$glob = new GlobIterator('./*');
print_r(iterator_to_array($glob));
结果只是Array(),数组中没有项目.
有人可以告诉我为什么会这样吗?
我已经在Windows 8 / Apache 2 / PHP 5.3上对此进行了测试.
显然,this works from CLI以及Linux上也是如此.
也许这是Windows上的Apache SAPI的错误?
解决方法:
介绍
根据PHP Documentation,glob和GlobIterator的初始参数完全不同.目前尚不清楚为何如此,但已明确指出.
array [glob][3] ( string $pattern [, int $flags = 0 ] )
^
|--- Expects pattern
public [GlobIterator::__construct][5] ( string $path [, int $flags = FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO ] )
^
|--- Expects Path
解决方案
始终使用完整路径.几次遇到此错误,但是如果您使用完整路径,可以确保它们都将返回相同的文件列表
没有完整路径的示例
$path = "./test";
$glob1 = glob($path . '/*');
print_r($glob1);
$glob2 = new GlobIterator($path . '/*');
print_r(iterator_to_array($glob2));
输出量
Array
(
[0] => ./test/fake.png
[1] => ./test/php-logo-virus.jpg
[2] => ./test/save
[3] => ./test/test.png
)
Array
(
)
全路径示例
$path = __DIR__ ."/test";
$glob1 = glob($path . '/*');
print_r($glob1);
$glob2 = new GlobIterator($path . '/*');
print_r(iterator_to_array($glob2));
输出量
Array
(
[0] => C:\lab\*/test/fake.png
[1] => C:\lab\*/test/php-logo-virus.jpg
[2] => C:\lab\*/test/save
[3] => C:\lab\*/test/test.png
)
Array
(
[C:\lab\*/test\fake.png] => SplFileInfo Object
(
[pathName:SplFileInfo:private] => C:\lab\*/test\fake.png
[fileName:SplFileInfo:private] => fake.png
)
[C:\lab\*/test\php-logo-virus.jpg] => SplFileInfo Object
(
[pathName:SplFileInfo:private] => C:\lab\*/test\php-logo-virus.jpg
[fileName:SplFileInfo:private] => php-logo-virus.jpg
)
[C:\lab\*/test\save] => SplFileInfo Object
(
[pathName:SplFileInfo:private] => C:\lab\*/test\save
[fileName:SplFileInfo:private] => save
)
[C:\lab\*/test\test.png] => SplFileInfo Object
(
[pathName:SplFileInfo:private] => C:\lab\*/test\test.png
[fileName:SplFileInfo:private] => test.png
)
)
输出不同格式
如您所见,$glob1!== $glob2不是因为文件不存在,而是因为glob将返回带有文件字符串路径的数组,而GlobIterator将返回SplFileInfo
,这具有其优势.
要从GlobIterator获取纯数组列表:
print_r(array_values(array_map("strval",iterator_to_array($glob2))));
结论
是的,到目前为止,您的代码可以在任何平台上运行,并且可以进行单元测试并保持一致性.我不需要开始告诉GlobIterator或Iterator或glob的优点,但是请放心,正确使用时会返回相同的结果