2013-05-06 92 views
3

我正在嘗試使用GlobIterator class爲什麼GlobIterator產生與glob函數不同的輸出?

我使用與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的錯誤?

+0

嘗試使用'放心__DIR__。 '/ *''而不是''./*''。如果仍然失敗,可能與https://bugs.php.net/bug.php?id=55701有關。 – Gordon 2013-05-10 13:29:09

回答

3

介紹

按照PHP DocumentationglobGlobIterator初始參數是完全不同的。它不清楚爲什麼這是如此,但它是明確表示。

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 

解決方案

始終使用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 pathGlobIterator將返回SplFileInfo有其上優點。

GlobIterator得到純淨的數組列表:

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

結論

是您的代碼將在任何平臺上工作至今你做Unit Testing和保持一致性。我並不需要開始講的GlobIteratorIteratorglob的優勢,但正確使用時將返回相同的結果

+0

如果您想要使用字符串而不是'SplFileInfo',則還可以使用'CURRENT_AS_PATHNAME'標誌。 – hakre 2013-05-23 23:14:52

相關問題