Signatur
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
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";
}
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";
}
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 . ' ';
}
// 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.