| SPL - Die Standard PHP Library - Inhalte filtern |
|
Seite 6 von 7
Inhalte filtern mit der FilterIterator KlasseDie FilterIterator Klasse kommt verhältnismässig bescheiden daher, denn neben den 5 Standard Iterator Methoden verfügt diese Klasse nur über einen Konstruktor und diese Methoden:
Nichts desto Trotz ist der Einfluß dieser Klasse gewaltig, denn mit ihr können wir genau festlegen was gefiltert wird und was nicht. Um eine (Filter)Bedingung an die FilterIterator Klasse zu übergeben, müssen wir eine eigene Klasse schreiben und die FilterIterator Klasse erweitern. Das Listing der FilterIterator Klasse Erweiterung: class DateiFilter extends FilterIterator { private $erweiterung; private $zeiger; public function __construct( $iterator, $erweiterung ) { parent::__construct( $iterator ); $this->zeiger = $iterator; $this->erweiterung = $erweiterung; } public function accept() { if (!$this->zeiger->isDir()) { if (gettype( $this->erweiterung ) == "array") { $ArrayObjekt = new ArrayObject( $this->erweiterung ); $zeiger = $ArrayObjekt->getIterator(); $zeiger->rewind(); foreach ($zeiger as $schluessel => $wert) { $erweiterung = array_reverse( explode( '.', $this->current() ) ); if ($erweiterung[0] == $wert) $erweiterungen[] = $this->erweiterung; } return $erweiterungen; } else { $erweiterung = array_reverse( explode( '.', $this->current() ) ); return $erweiterung[0] == $this->erweiterung; } } return true; } } Da für diesen Artikel ein gutes Verständnis der OOP vorausgesetzt wird sollten hier eigentlich keine großen Erklärungen nötig sein. Der Konstruktor erwartet zwei Parameter: 1) die zu iterierende Resource und 2) die erlaubte Datei-Endung(en). Um den neuen Filter in Aktion zu sehen rufen wir unsere Klasse mit folgendem Code auf: $verzeichnis = new DateiFilter( new RecursiveIteratorIterator( new RecursiveDirectoryIterator( 'testdateien/' ) ), 'jpg' ); foreach ($verzeichnis as $datei) { echo $datei. "<br />\n"; } Um mehrere Dateiendungen aufzulisten übergeben wir beim Aufruf ein Array: $verzeichnis = new DateiFilter( new RecursiveIteratorIterator( new RecursiveDirectoryIterator( 'testdateien/' ) ), array( 'jpg', 'html' )); foreach ($verzeichnis as $datei) { echo $datei. "<br />\n"; } Die inneren Instanziierungen kennen wir vom letzten Beispiel. Das so erzeugte Objekt übergeben wir, zusammen mit der erlaubten Datei-Endung (jpg), an unsere DateiFilter Klasse. Anschliessend geben wir in einer einfachen foreach() sämtliche gefundene Dateien aus die auf jpg enden. Statt dem echo() in der foreach() könnten wir auch genauso gut, nachdem wir eine Zip-Datei geöffnet/angelegt haben, das $zip->addFile() dort stehen haben oder jede beliebige andere Aktion hier ausführen. Selbstverständlich könnten wir die Methode accept() auch erweitern, so daß z.B. mit $zeiger->getMTime() geprüft wird ob $zeiger->current() neuer oder älter als eine Datei im Zip-Archiv ist und auf diese Weise so etwas wie ein Inkrementelles Backup Script erzeugen. |