Signatur
Beschreibung
RecursiveCachingIterator erweitert den CachingIterator um die Fähigkeit, rekursiv in Kindknoten eines RecursiveIterator hinabzusteigen. Dadurch lassen sich hierarchische Strukturen (z. B. Verzeichnisbäume, verschachtelte Arrays via RecursiveArrayIterator) durchlaufen und gleichzeitig vorausschauen, ob ein nächstes Element existiert – was bei der Ausgabe von Bäumen (z. B. HTML-Listen) sehr nützlich ist.
Wie CachingIterator speichert er den aktuellen Wert im internen Cache, sodass über hasNext() ein Lookahead möglich ist. Dies erlaubt zum Beispiel, vor dem letzten Listenelement ein schließendes Tag zu setzen, ohne den Iterator neu starten zu müssen.
Durch die Implementierung von RecursiveIterator kann dieser Iterator zusammen mit RecursiveIteratorIterator verwendet werden, um vollständig rekursiv durch die gesamte Tiefe einer Baumstruktur zu iterieren. Das Flag CachingIterator::CHILD_ARRAYS_ONLY (bzw. CALL_TOSTRING etc.) steuert dabei das Verhalten beim Stringcasting der Elemente.
Typische Anwendungsfälle sind die Ausgabe von Navigationsmenüs, Dateisystem-Strukturen oder beliebig tiefen verschachtelten Datenstrukturen, bei denen man wissen muss, ob ein aktueller Knoten Kinder hat und ob es ein nächstes Geschwisterelement gibt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $iterator Pflicht | Iterator | Ein RecursiveIterator-Objekt, über das iteriert werden soll (z. B. RecursiveArrayIterator oder RecursiveDirectoryIterator). |
|
| $flags | int | CachingIterator::CALL_TOSTRING | Optionale Flags zur Steuerung des Verhaltens. Mögliche Werte sind Konstanten aus CachingIterator, z. B. CALL_TOSTRING, TOSTRING_USE_KEY, TOSTRING_USE_CURRENT, TOSTRING_USE_INNER, CATCH_GET_CHILD oder FULL_CACHE. |
Rückgabewert
Beispiele
Rekursive Iteration über ein verschachteltes Array
<?php
$data = [
'Früchte' => [
'Äpfel',
'Birnen',
'Kirschen',
],
'Gemüse' => [
'Karotten',
'Brokkoli',
],
];
$recursive = new RecursiveArrayIterator($data);
$caching = new RecursiveCachingIterator($recursive, CachingIterator::CALL_TOSTRING);
$rii = new RecursiveIteratorIterator(
$caching,
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($rii as $key => $value) {
$indent = str_repeat(' ', $rii->getDepth());
if ($rii->callHasChildren()) {
echo $indent . "[Gruppe] " . $key . "\n";
} else {
echo $indent . "- " . $value . "\n";
}
}
Lookahead mit hasNext() beim Aufbau einer HTML-Liste
<?php
$items = new RecursiveArrayIterator(['Alpha', 'Beta', 'Gamma']);
$cit = new RecursiveCachingIterator($items, CachingIterator::FULL_CACHE);
echo '<ul>' . PHP_EOL;
foreach ($cit as $item) {
$last = !$cit->hasNext() ? ' class="last"' : '';
echo ' <li' . $last . '>' . htmlspecialchars((string)$item) . '</li>' . PHP_EOL;
}
echo '</ul>' . PHP_EOL;
// Wichtig · Fallstricke
Flag CATCH_GET_CHILD: Standardmäßig wird eine Exception geworfen, wenn getChildren() fehlschlägt. Mit dem Flag CachingIterator::CATCH_GET_CHILD wird diese Exception still ignoriert – sinnvoll, wenn nicht alle Knoten tatsächlich RecursiveIterator zurückgeben.
Speicherverbrauch: Das Flag FULL_CACHE speichert alle Elemente im RAM. Bei sehr großen Datenmengen (z. B. tiefe Verzeichnisstrukturen) kann dies zu erhöhtem Speicherbedarf führen.
PHP-Version: Die Klasse ist seit PHP 5.1.0 verfügbar. Einige Flags wie TOSTRING_USE_INNER wurden in späteren Minor-Versionen ergänzt – bitte die jeweilige PHP-Dokumentation prüfen.