3

我正在尝试使用GlobIterator 类

我使用与glob 函数中相同的 PATTERN ,但 GlobIterator 生成一个空数组。

例子:

$glob = glob('./*');
print_r($glob);

会给我当前目录中所有文件的数组。

但是当我这样做时

$glob = new GlobIterator('./*');
print_r(iterator_to_array($glob));

结果只是Array()数组中没有项目。

有人能告诉我为什么会这样吗?

我已经在 Windows 8 / Apache 2 / PHP 5.3 上对此进行了测试。

显然,这适用于 CLI,也适用于 Linux。

也许这是 Windows 上 Apache SAPI 的错误?

4

1 回答 1

3

介绍

根据PHP Documentation,初始参数完全不同globGlobIterator目前尚不清楚为什么会这样,但已明确说明。

球体

 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

解决方案

始终使用full 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\stackoverflow/test/fake.png
    [1] => C:\lab\stackoverflow/test/php-logo-virus.jpg
    [2] => C:\lab\stackoverflow/test/save
    [3] => C:\lab\stackoverflow/test/test.png
)
Array
(
    [C:\lab\stackoverflow/test\fake.png] => SplFileInfo Object
        (
            [pathName:SplFileInfo:private] => C:\lab\stackoverflow/test\fake.png
            [fileName:SplFileInfo:private] => fake.png
        )

    [C:\lab\stackoverflow/test\php-logo-virus.jpg] => SplFileInfo Object
        (
            [pathName:SplFileInfo:private] => C:\lab\stackoverflow/test\php-logo-virus.jpg
            [fileName:SplFileInfo:private] => php-logo-virus.jpg
        )

    [C:\lab\stackoverflow/test\save] => SplFileInfo Object
        (
            [pathName:SplFileInfo:private] => C:\lab\stackoverflow/test\save
            [fileName:SplFileInfo:private] => save
        )

    [C:\lab\stackoverflow/test\test.png] => SplFileInfo Object
        (
            [pathName:SplFileInfo:private] => C:\lab\stackoverflow/test\test.png
            [fileName:SplFileInfo:private] => test.png
        )

)

输出不同的格式

正如您所看到$glob1 !== $glob2的,不是因为文件不存在,而是因为glob会返回一个array with string path文件,而GlobIterator会返回SplFileInfo有其优势。

要从以下位置获取纯数组列表GlobIterator

print_r(array_values(array_map("strval",iterator_to_array($glob2))));

结论

是的,到目前为止,您的代码可以在任何平台上运行Unit Testing并保持一致性。我不需要开始讲述GlobIterator or的优点Iteratorglob但请放心,正确使用会返回相同的结果

于 2013-05-09T15:42:27.453 回答