Signatur
Beschreibung
RecursiveTreeIterator ist eine spezialisierte Erweiterung von RecursiveIteratorIterator, die für jeden Knoten automatisch Präfixe (wie ├──, └──, │) generiert, sodass die Baumstruktur bei der Ausgabe visuell erkennbar wird. Dies ist besonders nützlich, um Verzeichnisstrukturen, Menühierarchien oder Kategorien übersichtlich in der Konsole oder im Quelltext darzustellen.
Der Iterator umschließt einen beliebigen RecursiveIterator – z. B. einen RecursiveArrayIterator oder RecursiveDirectoryIterator – und liefert beim Durchlauf für jedes Element einen fertig formatierten String zurück, der Ebene und Position (erstes Kind, letztes Kind, Zwischenknoten) berücksichtigt.
Über die Konstruktor-Parameter lassen sich der Iterationsmodus, Flags sowie eigene Präfix-Teile (z. B. Unicode-Zeichen statt ASCII) konfigurieren. Die Präfixe werden mit setPrefixPart() individuell angepasst. Mit getPrefix() und getEntry() kann der aktuelle Präfix-String bzw. der Eintragsname separat abgerufen werden.
Typische Einsatzbereiche sind CLI-Tools, Debug-Ausgaben oder die Visualisierung von Dateisystem-Inhalten.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $it Pflicht | RecursiveIterator|IteratorAggregate | Der zu iteriererende rekursive Iterator, z. B. ein RecursiveArrayIterator oder RecursiveDirectoryIterator. |
|
| $mode | int | RecursiveTreeIterator::BYPASS_KEY | Iterationsmodus. Mögliche Werte: RecursiveIteratorIterator::LEAVES_ONLY, RecursiveIteratorIterator::SELF_FIRST, RecursiveIteratorIterator::CHILD_FIRST. |
| $flags | int | 0 | Flags zur Steuerung des Verhaltens. Z. B. RecursiveTreeIterator::BYPASS_CURRENT oder RecursiveTreeIterator::BYPASS_KEY. |
| $riFlags | int | RecursiveIteratorIterator::CATCH_GET_CHILD | Flags für den internen RecursiveIteratorIterator, z. B. um Fehler beim Zugriff auf Kinder zu unterdrücken. |
Beispiele
ASCII-Baum aus einem verschachtelten Array
<?php
$data = [
'Früchte' => [
'Äpfel' => [
'Gala',
'Braeburn',
],
'Bananen',
],
'Gemüse' => [
'Karotten',
'Brokkoli',
],
];
$iterator = new RecursiveTreeIterator(
new RecursiveArrayIterator($data)
);
foreach ($iterator as $key => $value) {
echo $value . PHP_EOL;
}
Unicode-Präfixe für eine schönere Baumdarstellung
<?php
$data = [
'src' => [
'Controller' => ['HomeController.php', 'UserController.php'],
'Model' => ['User.php'],
],
'public' => ['index.php', 'style.css'],
];
$iterator = new RecursiveTreeIterator(
new RecursiveArrayIterator($data),
RecursiveTreeIterator::BYPASS_KEY
);
// Unicode-Box-Zeichen als Präfixe setzen
$iterator->setPrefixPart(RecursiveTreeIterator::PREFIX_LEFT, '');
$iterator->setPrefixPart(RecursiveTreeIterator::PREFIX_MID_HAS_NEXT, '│ ');
$iterator->setPrefixPart(RecursiveTreeIterator::PREFIX_MID_LAST, ' ');
$iterator->setPrefixPart(RecursiveTreeIterator::PREFIX_END_HAS_NEXT, '├── ');
$iterator->setPrefixPart(RecursiveTreeIterator::PREFIX_END_LAST, '└── ');
foreach ($iterator as $value) {
echo $value . PHP_EOL;
}
// Wichtig · Fallstricke
Flags BYPASS_KEY vs. BYPASS_CURRENT: BYPASS_KEY (Standard) sorgt dafür, dass current() den vollständigen Präfix-String zurückgibt und der Schlüssel unverändert bleibt. Mit BYPASS_CURRENT gibt key() den Präfix-String zurück. Ohne diese Flags gibt current() nur den reinen Eintrags-Wert ohne Präfix zurück.
Rekursive Strukturen: Bei zirkulären Referenzen in den Daten kann es zu Endlosschleifen kommen. Solche Strukturen sollten vor der Übergabe bereinigt werden.
Kompatibilität: Die Klasse ist seit PHP 5.3 verfügbar und in der SPL-Erweiterung enthalten, die standardmäßig aktiv ist. Die genaue Anzahl der Präfix-Konstanten (PREFIX_LEFT, PREFIX_MID_HAS_NEXT usw.) und deren Werte sollten in der Dokumentation nachgeschlagen werden, da sie sich je nach PHP-Version leicht unterscheiden können.