PHP   发布时间:2022-04-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为什么GlobIterator产生的输出不同于glob函数?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在尝试使用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的初始参数完全不同.目前尚不清楚为何如此,但已明确指出.

glob

 array [glob][3] ( String $pattern [, int $flags = 0 ] )
                              ^
                              |--- Expects pattern

GlobIterator

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\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将返回带有文件字符串路径的数组,而GlobIterator将返回SplFileInfo,这具有其优势.

要从GlobIterator获取纯数组列表:

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

结论

是的,到目前为止,您的代码可以在任何平台上运行,并且可以进行单元测试并保持一致性.我不需要开始告诉GlobIterator或Iterator或glob的优点,但是请放心,正确使用时会返回相同的结果

大佬总结

以上是大佬教程为你收集整理的为什么GlobIterator产生的输出不同于glob函数?全部内容,希望文章能够帮你解决为什么GlobIterator产生的输出不同于glob函数?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: