ID:               49755
 Updated by:       col...@php.net
 Reported By:      sala...@php.net
-Status:           Assigned
+Status:           Wont fix
 Bug Type:         SPL related
 Operating System: OS X
 PHP Version:      5.3.0
 Assigned To:      colder
 New Comment:

This is, sadly, expected. DirectoryIterator is a weird iterator, first
of all, it implements SplFileInfo, and, instead of returning new
instances of SplFileInfo on current(), it returns itself.

So, if you store each value in an array, they will all be the same
DirectoryIterator object, pointing to beyond the last element. The only
solution is to clone it while puting it in an array, but
iterator_to_array doesn't clone (and shouldn't clone).

You can similarly reproduce it with:

$dit = new DirectoryIterator(dirname(__FILE__));
$arr = array();
foreach ($ait as $file) {
    $arr[] = $file;
}

foreach($arr as $file) {
    var_dump($file->getFileName());
}




Previous Comments:
------------------------------------------------------------------------

[2009-10-02 21:09:31] f...@php.net

Not 5.3.0 only, also reproducable on a
"PHP 5.2.6-1+lenny3 with Suhosin-Patch 0.9.6.2"

------------------------------------------------------------------------

[2009-10-02 19:02:20] sala...@php.net

Description:
------------
When converting a DirectoryIterator instance into an array using
iterator_to_array, the array items appear to be converted to basic
DirectoryIterator instances with none of the file information intact.
The same does not appear to occur for other related classes
(FilesystemIterator, RecursiveDirectoryIterator).

Reproduce code:
---------------
<?php

echo "DirectoryIterator:\n";
$dit = new DirectoryIterator(dirname(__FILE__));
$ait = iterator_to_array($dit);
foreach ($ait as $file) {
        var_dump($file->getFilename());
}

echo "RecursiveDirectoryIterator:\n";
$rdit = new RecursiveDirectoryIterator(dirname(__FILE__));
$ait = iterator_to_array($rdit);
foreach ($ait as $file) {
        var_dump($file->getFilename());
}

?>

Expected result:
----------------
DirectoryIterator:
string(1) "."
string(2) ".."
string(7) "bug.php"
RecursiveDirectoryIterator:
string(7) "bug.php"


Actual result:
--------------
DirectoryIterator:
string(0) ""
string(0) ""
string(0) ""
RecursiveDirectoryIterator:
string(7) "bug.php"



------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=49755&edit=1

Reply via email to