phpBuddy

Webhosting Gutscheine

Auf der Suche nach einem top Provider? Dann lohnt ein Blick auf diesen Artikel - Gutscheine zum Geld sparen gibt's inklusive!

Sie sind hier: Startseite Die Standard PHP Library
SPL - Die Standard PHP Library - Inhalte filtern
Beitragsseiten
SPL - Die Standard PHP Library
Unser erstes Iterator-Beispiel
Mit Verzeichnissen arbeiten
Zip-Dateien on-the-fly erstellen
Backup Basis Script
Inhalte filtern
Fazit und Schlußwort
Alle Seiten

Inhalte filtern mit der FilterIterator Klasse

Die 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:

  • getInnerIterator() - Ermittelt an welcher Position der Zeiger im inneren Iterator steht
  • accept() - Nimmt eine Bedingung auf um zu entscheiden ob das gegenwärtige Element (current()) gefiltert werden soll

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).
Die Methode accept() in unserer Klasse wurde nicht willkürlich so genannt, sondern muß so heissen, damit wir die Methode accept() der FilterIterator Klasse überladen können.

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.