Start · Sprachen · PHP · Referenz · CallbackFilterIterator

CallbackFilterIterator

Klasse

Filtert die Elemente eines beliebigen <code>Iterator</code>s anhand einer Callback-Funktion und gibt nur die Elemente zurück, für die der Callback <code>true</code> liefert.

seit PHP 5.4.0 Kategorie: oop

Signatur

class CallbackFilterIterator extends FilterIterator implements OuterIterator

Beschreibung

CallbackFilterIterator erweitert FilterIterator und ermöglicht es, einen bestehenden Iterator mit einer frei definierbaren Callback-Funktion zu filtern, ohne eine eigene Unterklasse erstellen zu müssen. Der Callback wird für jedes Element des inneren Iterators aufgerufen; liefert er einen truthy-Wert, wird das Element in die Ausgabe aufgenommen, andernfalls übersprungen.

Der Callback erhält drei Argumente: den aktuellen Wert ($current), den aktuellen Schlüssel ($key) und das Iterator-Objekt selbst ($iterator). Dadurch lassen sich auch schlüsselabhängige oder iteratorabhängige Filterlogiken sauber implementieren.

Typische Anwendungsfälle sind das Filtern von Dateilisten (z. B. in Kombination mit DirectoryIterator), das Einschränken großer Datensätze ohne sie vollständig in ein Array zu laden, oder das Verketten mehrerer Filterschritte über verschachtelte Iteratoren.

Da CallbackFilterIterator OuterIterator implementiert, kann er problemlos in weitere Iterator-Dekoratoren (z. B. LimitIterator) eingebettet werden, was sehr flexible und speichereffiziente Pipelines erlaubt.

Parameter

Name Typ Default Beschreibung
$iterator Pflicht Iterator Der zu filternde innere Iterator. Alle Typen, die das Iterator-Interface implementieren, sind erlaubt.
$callback Pflicht callable Eine Callback-Funktion mit der Signatur callback($current, $key, $iterator): bool. Gibt sie einen truthy-Wert zurück, wird das aktuelle Element durchgelassen, andernfalls gefiltert.

Rückgabewert

Typ

Beispiele

Gerade Zahlen aus einem ArrayIterator filtern

<?php
$numbers = new ArrayIterator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);

$evenNumbers = new CallbackFilterIterator($numbers, function ($current, $key, $iterator) {
    return $current % 2 === 0;
});

foreach ($evenNumbers as $key => $value) {
    echo "$key => $value\n";
}
1 => 2 3 => 4 5 => 6 7 => 8 9 => 10

PHP-Dateien in einem Verzeichnis filtern

<?php
$dir = new DirectoryIterator(__DIR__);

$phpFiles = new CallbackFilterIterator($dir, function ($current, $key, $iterator) {
    /** @var DirectoryIterator $current */
    return $current->isFile() && $current->getExtension() === 'php';
});

foreach ($phpFiles as $file) {
    echo $file->getFilename() . "\n";
}
index.php config.php ...

Kombination mit LimitIterator für paginiertes Filtern

<?php
$data = new ArrayIterator(range(1, 100));

// Nur Werte > 10 durchlassen
$filtered = new CallbackFilterIterator($data, fn($v) => $v > 10);

// Davon die ersten 5 Ergebnisse (Seite 1)
$page = new LimitIterator($filtered, 0, 5);

foreach ($page as $value) {
    echo $value . ' ';
}
11 12 13 14 15

// Wichtig · Fallstricke

Schlüssel bleiben erhalten: Die Original-Schlüssel des inneren Iterators werden durchgereicht und nicht neu nummeriert. Soll eine lückenlose numerische Indexierung entstehen, muss das Ergebnis z. B. mit iterator_to_array($iter, false) in ein Array umgewandelt werden.

Rückspulen: Beim erneuten Durchlaufen (z. B. in einer zweiten foreach-Schleife) wird rewind() aufgerufen. Nicht alle inneren Iteratoren (z. B. Generator-basierte) unterstützen dies; in solchen Fällen liefert die zweite Iteration keine Ergebnisse.

Performance: Da der Filter lazy ausgewertet wird, werden Elemente erst dann geprüft, wenn der Iterator voranschreitet. Das macht CallbackFilterIterator für große oder unendliche Datenströme besonders geeignet.