Signatur
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;
}
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());
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;
}
}
// 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.