Start · Sprachen · PHP · Referenz · RecursiveArrayIterator

RecursiveArrayIterator

Klasse

Ermöglicht das rekursive Iterieren über Arrays und Objekte, einschließlich geschachtelter Strukturen, mit der Möglichkeit, Werte und Schlüssel zu ändern oder zu entfernen.

seit PHP 5.1.0 Kategorie: oop

Signatur

class RecursiveArrayIterator extends ArrayIterator implements RecursiveIterator

Beschreibung

RecursiveArrayIterator erweitert ArrayIterator um die Fähigkeit, in geschachtelte Arrays oder Objekte hinabzusteigen. Er implementiert das RecursiveIterator-Interface und stellt damit die Methoden hasChildren() und getChildren() bereit, die von Klassen wie RecursiveIteratorIterator genutzt werden, um Bäume und mehrdimensionale Arrays vollautomatisch zu traversieren.

Typischer Einsatz: Wenn ein mehrdimensionales Array oder ein verschachteltes Objekt vollständig durchlaufen werden soll, ohne eigene Rekursion schreiben zu müssen. In Kombination mit RecursiveIteratorIterator lassen sich alle Blattknoten oder alle Ebenen eines Arrays mit einer einzigen foreach-Schleife verarbeiten.

Ein wichtiges Merkmal ist das Flag-System (geerbt von ArrayIterator): Mit dem Flag RecursiveArrayIterator::CHILD_ARRAYS_ONLY werden nur Array-Werte als Kinder betrachtet, Objekte hingegen nicht – was bei gemischten Strukturen nützlich ist.

Wie sein Elternteil ArrayIterator unterstützt RecursiveArrayIterator das direkte Ändern (offsetSet) und Entfernen (offsetUnset) von Elementen während der Iteration, was eine flexible In-place-Bearbeitung der Quelldaten ermöglicht.

Parameter

Name Typ Default Beschreibung
$array array|object [] Das zu iterierende Array oder Objekt. Standardmäßig ein leeres Array.
$flags int 0 Steuerflags für das Verhalten des Iterators. Mögliche Werte: ArrayIterator::STD_PROP_LIST (Objekteigenschaften als Liste), ArrayIterator::ARRAY_AS_PROPS (Array-Einträge als Eigenschaften), RecursiveArrayIterator::CHILD_ARRAYS_ONLY (nur Arrays, keine Objekte als Kinder).

Beispiele

Alle Blattknoten eines mehrdimensionalen Arrays ausgeben

<?php
$data = [
    'fruits' => ['apple', 'banana', 'cherry'],
    'veggies' => ['carrot', 'pea'],
    'misc' => 'nothing here',
];

$iterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator($data),
    RecursiveIteratorIterator::LEAVES_ONLY
);

foreach ($iterator as $key => $value) {
    echo $key . ': ' . $value . PHP_EOL;
}
0: apple 1: banana 2: cherry 0: carrot 1: pea misc: nothing here

Werte während der Iteration ändern

<?php
$data = [
    'a' => 1,
    'b' => ['c' => 2, 'd' => 3],
    'e' => 4,
];

$rai = new RecursiveArrayIterator($data);

// Obere Ebene: alle Werte verdoppeln (nicht-Array-Werte)
foreach ($rai as $key => $value) {
    if (!is_array($value)) {
        $rai->offsetSet($key, $value * 2);
    }
}

print_r($rai->getArrayCopy());
Array ( [a] => 2 [b] => Array ( [c] => 2 [d] => 3 ) [e] => 8 )

Verwendung von CHILD_ARRAYS_ONLY-Flag

<?php
$data = [
    'list'   => ['x', 'y', 'z'],
    'obj'    => new stdClass(),
    'scalar' => 42,
];

$iterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator($data, RecursiveArrayIterator::CHILD_ARRAYS_ONLY),
    RecursiveIteratorIterator::SELF_FIRST
);

foreach ($iterator as $key => $value) {
    $depth = str_repeat('  ', $iterator->getDepth());
    if (is_array($value)) {
        echo $depth . "[Array: $key]" . PHP_EOL;
    } elseif (is_object($value)) {
        echo $depth . "[Object: $key]" . PHP_EOL;
    } else {
        echo $depth . "$key => $value" . PHP_EOL;
    }
}
[Array: list] 0 => x 1 => y 2 => z [Object: obj] scalar => 42

// Wichtig · Fallstricke

Rekursion nur mit RecursiveIteratorIterator: RecursiveArrayIterator allein iteriert nur über die oberste Ebene. Die eigentliche Tiefentraversierung findet erst statt, wenn er in einen RecursiveIteratorIterator eingebettet wird.

Änderungen am Originaldaten: Da RecursiveArrayIterator eine Kopie des übergebenen Arrays speichert (wie ArrayIterator), wirken sich Änderungen via offsetSet()/offsetUnset() nicht auf das ursprüngliche PHP-Array aus. Mit getArrayCopy() erhält man den aktuellen Stand.

Objekte als Eingabe: Wird ein Objekt übergeben, werden dessen zugängliche Eigenschaften iteriert. Mit dem Flag CHILD_ARRAYS_ONLY werden Objekte innerhalb der Struktur nicht rekursiv abgestiegen, was unerwartetes Verhalten bei gemischten Daten verhindert.