Start · Sprachen · PHP · Referenz · RecursiveTreeIterator

RecursiveTreeIterator

Klasse

Iteriert über einen <code>RecursiveIterator</code> und erzeugt dabei eine ASCII-Baum-Darstellung der hierarchischen Struktur.

seit PHP 5.3.0 Kategorie: oop

Signatur

class RecursiveTreeIterator extends RecursiveIteratorIterator implements OuterIterator

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;
}
\-Früchte \-Äpfel | |-0 | \-1 \-Bananen \-Gemüse |-Karotten \-Brokkoli

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;
}
├── src │ ├── Controller │ │ ├── HomeController.php │ │ └── UserController.php │ └── Model │ └── User.php └── public ├── index.php └── style.css

// 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.