Bug #49755 [Com]: iterator_to_array nukes DirectoryIterator

From: Date: Sat, 11 Jan 2014 10:17:27 +0000
Subject: Bug #49755 [Com]: iterator_to_array nukes DirectoryIterator
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-183712@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=49755&edit=1

 ID:                 49755
 Comment by:         dr dot dimitru at gmail dot com
 Reported by:        salathe@php.net
 Summary:            iterator_to_array nukes DirectoryIterator
 Status:             Wont fix
 Type:               Bug
 Package:            SPL related
 Operating System:   OS X
 PHP Version:        5.3.0
 Assigned To:        colder
 Block user comment: N
 Private report:     N

 New Comment:

Reproduced on Debian (Jessie) | PHP 5.5.7-2


Previous Comments:
------------------------------------------------------------------------
[2009-10-06 13:50:36] colder@php.net

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());
}



------------------------------------------------------------------------
[2009-10-02 21:09:31] fa@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] salathe@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 https://bugs.php.net/bug.php?id=49755&edit=1


Thread (6 messages)

« previous php.bugs (#183712) next »