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 :)
A bejegyzés trackback címe:
Kommentek:
A hozzászólások a vonatkozó jogszabályok értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a Felhasználási feltételekben és az adatvédelmi tájékoztatóban.