gpt4 book ai didi

php - 为什么 GlobIterator 产生的输出与 glob 函数不同?

转载 作者:搜寻专家 更新时间:2023-10-31 20:43:35 35 4
gpt4 key购买 nike

我正在尝试使用 GlobIterator class .

我使用与 glob function 中相同的模式, 但 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 , globGlobIterator 初始参数是完全不同的。不清楚为什么会这样,但已明确说明。

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 会返回一个带有字符串路径的数组 code> 文件,而 GlobIterator 将返回 SplFileInfo这有其优势。

GlobIterator 获取纯数组列表:

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

结论

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

关于php - 为什么 GlobIterator 产生的输出与 glob 函数不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16396334/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com