A nagy iterátor trükk

jan 18

Ha egy PHP-s iterátor elemeit egy tömbben szeretnénk eltárolni, arra alapvetően két lehetőségünk van. Az egyik, hogy foreach-csel végigmegyünk az iterátoron, és az elemeit egyesével bepakoljuk a tömbünkbe. A másik, egyszerűbb megoldás az iterator_to_array() használata, ami ugyanezt megcsinálja egy függvényhívással. Van azonban egy kivétel, aminél ez előbb említett két módszer egyike sem működik, vagy legalábbis nem a hagyományos formában. Ez pedig a DirectoryIterator. Az ok az, hogy ez az iterátor a végigjárása esetén nem más objektumokat ad vissza, hanem mindig önmagát. Emiatt az alábbi példakódban az $arr tömb minden egyes eleme ugyanazt a $dit példányt fogja tartalmazni.

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

A megoldás az, hogy minden egyes ciklusban klónozzuk az iterátort, így mindig azt a példányát tároljuk el, ami az adott fájlra hivatkozik:

foreach ($dir as $file) {
    $arr[] = clone $file;
}

UPDATE: Itt írtam egy posztot arról, hogy ilyet miért ne csináljunk :)

php