phpbar.de logo

Mailinglisten-Archive

[php] eindeutiges Zufallsbild

[php] eindeutiges Zufallsbild

Johannes Schlueter schlueter at phpbar.de
Die Jan 31 12:37:07 CET 2006


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