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