Mailinglisten-Archive |
Hi,
On Tuesday 31 January 2006 10:46, Sebastian Mendel wrote:
> $dir = new DirectoryIterator($path);
> while ($dir->valid()) {
> if ($dir->isFile() && $AA = @imagesx($dir->getPathname())) {
> $ergs[] = $dir->getPathname();
> }
> $dir->next();
> }
Wenn schon Iteratoren dann bitte richtig:
[
Disclaimer 1: Geht evtl. etwas von der Fragestellung weg und zeigt etwas über
Iterator-Verwendung ohne detailierte Diskussion des Sinns
disclaimer 2: Komplett ungetestet
]
1. Die Auswahl der elemente ist oft kein Teil der Datenverarbeitung sondern
der Datenbeschaffung sollte also vom Iterator, nicht im Schleifen-Block
passieren. Da hilft der Filter Iterator
class ImageFilterIterator extends FilterIterator {
public function accept() {
return $this->innerIterator()->isFile()
&& @imagesx($this->innerIterator()->getPathname());
}
public function current() {
return $this->innerIterator()->getPathname();
}
}
2. Über iterator_to_array kann man einen Iterator in ein Array kopieren, was
hier im Body gemacht wird, vorteil ist, dass das direkt auf C-Ebene passiert
und somit ein wenig schneller ist (wobei das unter normalen umständen zu
vernachlässigen sit)
$ergs = iterator_to_array(
new ImageFilterIterator(new DirectoryIterator($path)));
Kurze Diskussion:
Iteratoren sind eine nette Möglichkeit die Datenbeschaffung von der
Verarbeitung zu trennen. So kann die Datenquelle ohne großen aufwand geändert
werden (z.B. Bilder stehen in einer DB) ohne dass die Verarbeitung geändert
werden muss. Zudem wird die Verarbeitung oft etwas (sollte man abern icht
überbewerten...) beschleunigt (immer nur das aktuelle Element im Speicher und
nicht immer hin und her kopieren) Nachteil ist aber, dass der Code zunächst
komplexer wird.
So viel von meiner Mittagspause,
johannes
php::bar PHP Wiki - Listenarchive