Ist es in PHP möglich, ein (zweidimensionales) Array ohne Verwendung von Rekursion oder Referenzen zu reduzieren?
Ich interessiere mich nur für die Werte, damit die Schlüssel ignoriert werden können. Ich denke in den Zeilen von array_map()
und array_values()
.
php
arrays
multidimensional-array
flatten
Alix Axel
quelle
quelle
Antworten:
Sie können die Standard-PHP-Bibliothek (SPL) verwenden , um die Rekursion "auszublenden".
druckt
quelle
iterator_to_array($it, false)
vermeidet die Notwendigkeit für die foreach.function flatten($arr){ $it = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr)); return iterator_to_array($it, true); }
hoffe, das hilft anderen.Ab PHP 5.3 scheint die kürzeste Lösung
array_walk_recursive()
die neue Closures-Syntax zu sein:quelle
use
Syntax, damit dies funktioniert,array_walk_recursive
da es den optionalen$userdata
Parameter nicht als Referenz akzeptiertLösung für zweidimensionales Array
Bitte versuchen Sie dies:
EDIT: 21-Aug-13
Hier ist die Lösung, die für mehrdimensionale Arrays funktioniert:
Ref: http://php.net/manual/en/function.call-user-func-array.php
quelle
call_user_func_array('array_merge', [])
(Beachten Sie das leere Array) gibt null zurück und löst einen PHP-Warnfehler aus. Es ist eine clevere Lösung, wenn Sie sicher sind, dass Ihr Array nicht leer ist, aber das ist keine verbreitete Annahme, die viele machen können.$result = $array ?call_user_func_array('array_merge', $array) : [];
In PHP 5.6 und höher können Sie zweidimensionale Arrays mit
array_merge
reduzieren, nachdem Sie das äußere Array mit dem...
Operator entpackt haben . Der Code ist einfach und klar.Dies funktioniert auch mit der Sammlung von assoziativen Arrays.
Es funktioniert jedoch nicht, wenn das äußere Array nicht numerische Schlüssel enthält. In diesem Fall müssen Sie
array_values
zuerst anrufen .Update: Basierend auf einem Kommentar von @MohamedGharib
Dies löst einen Fehler aus, wenn das äußere Array leer ist, da
array_merge
es mit null Argumenten aufgerufen würde. Dies kann vermieden werden, indem als erstes Argument ein leeres Array hinzugefügt wird.quelle
array_merge([], ...$a);
Um die Rekursion zu reduzieren (wie Sie es gewünscht haben), können Sie einen Stapel verwenden . Natürlich können Sie dies in eine eigene Funktion umsetzen
array_flatten
. Das Folgende ist eine Version, die ohne Schlüssel funktioniert:Elemente werden in ihrer Reihenfolge verarbeitet. Da Unterelemente auf den Stapel verschoben werden, werden sie als Nächstes verarbeitet.
Es ist auch möglich, Schlüssel zu berücksichtigen. Sie benötigen jedoch eine andere Strategie, um den Stapel zu handhaben. Dies ist erforderlich, da Sie sich mit möglichen doppelten Schlüsseln in den Unterarrays befassen müssen. Eine ähnliche Antwort in einer verwandten Frage: PHP Gehen Sie durch mehrdimensionale Arrays, während Sie die Schlüssel beibehalten
Ich bin mir nicht ganz sicher, aber ich hatte dies in der Vergangenheit getestet: Das
RecurisiveIterator
verwendet Rekursion, es hängt also davon ab, was Sie wirklich brauchen. Sollte es möglich sein, einen rekursiven Iterator auch basierend auf Stapeln zu erstellen:Demo
Ich habe es bisher nicht geschafft, den Stack zu implementieren, auf dessen Basis
RecursiveIterator
ich das für eine gute Idee halte.quelle
if(!empty($value)){$flat[] = $value}
innerhalb der else-Anweisung hinzufügen , um zu verhindern, dass dem Ergebnisarray Leerzeichen hinzugefügt werden. Tolle Funktion!Einfache und einzeilige Antwort.
Verwendung:
Ausgabe (in PsySH):
Jetzt liegt es ganz bei Ihnen, wie Sie mit den Schlüsseln umgehen. Prost
BEARBEITEN (2017-03-01)
Zitat von Nigel Aldertons Anliegen / Problem:
Zitat von Svishs Antwort:
quelle
$array = ['a',['b','c']]
wirdArray ([0] => b, [1] => c )
. Das'a'
geht verloren, weil es'b'
auch einen Schlüssel von hat0
.false
als zweiten Parameter ($use_keys
) hinzuiterator_to_array
.Verwendet Rekursion. Wenn Sie sehen, wie unkomplex es ist, wird sich Ihre Angst vor Rekursion hoffentlich auflösen, sobald Sie sehen, wie unkomplex es ist.
Ausgabe:
quelle
Ich dachte nur, ich würde darauf hinweisen, dass dies eine Falte ist, damit array_reduce verwendet werden kann:
BEARBEITEN: Beachten Sie, dass dies so zusammengesetzt werden kann, dass eine beliebige Anzahl von Ebenen abgeflacht wird. Wir können dies auf verschiedene Arten tun:
Natürlich könnten wir auch Schleifen verwenden, aber die Frage fragt nach einer Kombinatorfunktion nach dem Vorbild von array_map oder array_values.
quelle
fold
es in 4 Ebenen oderfold . fold
in 3 Ebenen oderfold . fold . fold
in 2 Ebenen usw. unterteilen. Dadurch wird auch verhindert, dass Fehler versteckt werden. z.B. Wenn ich ein 5D-Array reduzieren möchte, aber ein 4D-Array erhalten möchte, wird der Fehler sofort ausgelöst.$concat
, ich denke, Sie sollten es einfach nennen$flatten
.array_merge
ist das PHP-Äquivalent von concat. Ich habe versucht ,array_concat
als Alias für hinzugefügt zu werdenarray_merge
.Flacht nur zweidimensionale Arrays ab:
quelle
Diese Lösung ist nicht rekursiv. Beachten Sie, dass die Reihenfolge der Elemente etwas gemischt ist.
quelle
shifting
der Wert aus dem Array und das erneute Anhängen an das Ende macht wenig Sinn. Ich denke du wolltestarray_merge()
stattdessen?Ich glaube, dies ist die sauberste Lösung, ohne Mutationen oder unbekannte Klassen zu verwenden.
quelle
Probieren Sie die folgende einfache Funktion aus:
Also daraus:
du erhältst:
quelle
Der Trick besteht darin, sowohl das Quell- als auch das Zielarray als Referenz zu übergeben.
quelle
Kernausschnitt
quelle
Sie können es mit Ouzo Goodies tun :
Siehe: Hier
quelle
Wenn Sie eine Rekursion wirklich nicht mögen ... versuchen Sie stattdessen zu verschieben :)
Hinweis: In dieser einfachen Version werden Array-Schlüssel nicht unterstützt.
quelle
continue
etwas schneller.Wie wäre es mit einem rekursiven Generator? https://ideone.com/d0TXCg
quelle
Für PHP 5.2
quelle
Diese Version kann tiefe, flache oder eine bestimmte Anzahl von Ebenen ausführen:
quelle
Weil der Code hier beängstigend aussieht. Hier ist eine Funktion, die auch ein mehrdimensionales Array in eine HTML-Form-kompatible Syntax konvertiert, die jedoch einfacher zu lesen ist.
quelle
Dies kann durch Verwendung erreicht werden
array_walk_recursive
Arbeitsbeispiel: - https://3v4l.org/FpIrG
quelle
Dies ist meine Lösung unter Verwendung einer Referenz:
quelle
quelle
Hier ist ein vereinfachter Ansatz:
quelle
Jeder, der nach einer wirklich sauberen Lösung sucht; Hier ist eine Option:
Druckt
quelle
Einfach eine andere Lösung posten)
quelle
Wenn Sie auch Ihre Schlüssel behalten möchten, ist das eine Lösung.
Leider werden nur endgültig verschachtelte Arrays ohne mittlere Schlüssel ausgegeben. Also für das folgende Beispiel:
Ausgabe ist:
quelle
Ich musste ein mehrdimensionales PHP-Array im HTML-Eingabeformat darstellen.
quelle
$var['a']['b']['c'][0] = 'a'; ...
.Wenn Sie ein Array von Objekten haben und es mit einem Knoten reduzieren möchten, verwenden Sie einfach diese Funktion:
quelle