Um ohne Rekursion zu flatten (wie Sie es gewünscht haben), können Sie eine Stapel . Natürlich können Sie dies in eine eigene Funktion einbauen, z. B. array_flatten
. Es folgt eine Version, die ohne Schlüssel funktioniert:.
function array_flatten(array $array)
{
$flat = array(); // initialize return array
$stack = array_values($array); // initialize stack
while($stack) // process stack until done
{
$value = array_shift($stack);
if (is_array($value)) // a value to further process
{
array_unshift($stack, ...$value);
}
else // a value to take
{
$flat[] = $value;
}
}
return $flat;
}
Die Elemente werden in ihrer Reihenfolge verarbeitet. Da die Unterelemente auf dem Stapel nach oben verschoben werden, werden sie als nächstes verarbeitet.
Es ist möglich, auch Schlüssel zu berücksichtigen, allerdings ist dann eine andere Strategie für den Umgang mit dem Stapel erforderlich. Das ist notwendig, weil Sie mit möglichen doppelten Schlüsseln in den Unterfeldern umgehen müssen. Eine ähnliche Antwort in einer verwandten Frage: PHP Walk durch mehrdimensionales Array unter Beibehaltung der Schlüssel
Ich bin mir nicht ganz sicher, aber ich habe dies in der Vergangenheit getestet: Die RecurisiveIterator
verwendet eine Rekursion, es kommt also darauf an, was Sie wirklich brauchen. Es sollte auch möglich sein, einen rekursiven Iterator auf Basis von Stapeln zu erstellen:
foreach(new FlatRecursiveArrayIterator($array) as $key => $value)
{
echo "** ($key) $value\n";
}
Demo
Ich habe es nicht geschafft, den Stack auf der Basis von RecursiveIterator
was ich für eine gute Idee halte.