Ist es in PHP möglich, so etwas zu tun? Wie würden Sie eine Funktion schreiben? Hier ist ein Beispiel. Die Reihenfolge ist das Wichtigste.
$customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';
Und ich würde gerne so etwas machen
$properOrderedArray = sortArrayByArray($customer, array('name', 'dob', 'address'));
Weil ich am Ende ein foreach () verwende und sie nicht in der richtigen Reihenfolge sind (weil ich die Werte an eine Zeichenfolge anhänge, die in der richtigen Reihenfolge sein muss und ich nicht alle Array-Schlüssel im Voraus kenne / Werte).
Ich habe die internen Array-Funktionen von PHP durchgesehen, aber anscheinend können Sie nur alphabetisch oder numerisch sortieren.
Los geht's:
quelle
array_merge()
!usort()
oderuasort()
?break
Anweisung einfügen , sobald der Wert gefunden wurde.array_merge()
den Array-+
Operator ersetzen . Es wird nach Schlüssel (auch für Zifferntasten) und von links nach rechts zusammengeführt , währendarray_merge
es von rechts nach links zusammengeführt wird und Zifferntasten niemals überschreibt. ZB[0,1,2]+[0,5,6,7] = [0,1,2,7]
währendarray_merge([0,1,2],[0,5,6,7]) = [0,1,2,0,5,6,7]
und['a' => 5] + ['a' => 7] = ['a' => 5]
docharray_merge(['a' => 5], ['a' => 7]) = ['a' => 7]
.+
Schild zu benutzen ?Wie wäre es mit dieser Lösung
quelle
O(n * log n)
, läuft dieser Algorithmus inO(n^2 * log(n))
.Ein anderer Weg für PHP> = 5.3.0:
Ergebnis:
Funktioniert gut mit Zeichenfolgen und Zifferntasten.
quelle
array_replace()
Absichten besser weitergeben kann alsarray_merge()
.array_replace
Lässt auch den Variablentyp intakt. Wenn einer der Werte in Ihrem Array gewesen wäre(string) '1'
und Sie den+
Operator verwendet hätten, wäre der Wert in(int) 1
array_merge()
würden sie nur angehängt?). Die Logik ist sehr gut erklärt hier . Erstens ,array_flip()
ändert den $ Werte Taste Befehl - Array. Zweitens werdenarray_replace()
die Werte des ersten Arrays durch Werte mit denselben Schlüsseln im zweiten Array ersetzt. Wenn Sie ein Array nach Schlüsseln eines anderen sortieren müssen, müssen Sie es nicht einmal verwendenarray_flip
.quelle
Nehmen Sie ein Array als Ihre Bestellung:
Sie können ein anderes Array anhand von Werten mithilfe von
array_intersect
Dokumenten sortieren :Oder verwenden Sie in Ihrem Fall zum Sortieren nach Schlüsseln die folgenden
array_intersect_key
Dokumente :Beide Funktionen behalten die Reihenfolge des ersten Parameters bei und geben nur die Werte (oder Schlüssel) des zweiten Arrays zurück.
Für diese beiden Standardfälle müssen Sie also keine eigene Funktion schreiben, um das Sortieren / Neuanordnen durchzuführen.
quelle
Ich habe die Lösung von Darkwaltz4 verwendet, aber
array_fill_keys
stattdessen verwendetarray_flip
, um zu füllen,NULL
wenn kein Schlüssel eingegeben wurde$array
.quelle
Ohne Magie ...
quelle
$dataset
mit dem ParameternamenWenn Sie ein Array in Ihrem Array haben, müssen Sie die Funktion von Eran ein wenig anpassen ...
quelle
Diese Funktion gibt ein untergeordnetes und sortiertes Array zurück, das auf dem zweiten Parameter $ keys basiert
Beispiel:
quelle
PHP hat Funktionen, die Ihnen dabei helfen:
Usort erledigt die ganze Arbeit für Sie und array_search stellt die Schlüssel bereit. array_search () gibt false zurück, wenn keine Übereinstimmung gefunden werden kann, sodass Elemente, die sich nicht im Sortierarray befinden, natürlich an den unteren Rand des Arrays verschoben werden.
Hinweis: uasort () ordnet das Array, ohne die Schlüssel => Wertebeziehungen zu beeinflussen.
quelle
Code:
quelle
Erster Vorschlag
Zweiter Vorschlag
Ich wollte darauf hinweisen, dass diese beiden Vorschläge großartig sind. Es sind jedoch Äpfel und Orangen. Der Unterschied? Einer ist nicht assoziativ freundlich und der andere ist assoziativ freundlich. Wenn Sie 2 vollständig assoziative Arrays verwenden, wird das Zusammenführen / Umdrehen des Arrays tatsächlich zusammengeführt und das andere assoziative Array überschrieben. In meinem Fall sind das nicht die Ergebnisse, nach denen ich gesucht habe. Ich habe eine settings.ini-Datei verwendet, um mein Sortierreihenfolge-Array zu erstellen. Das Datenarray, das ich sortierte, musste nicht von meinem Gegenstück zur assoziativen Sortierung überschrieben werden. Somit würde das Zusammenführen von Arrays mein Datenarray zerstören. Beide sind großartige Methoden, beide müssen in jeder Entwickler-Toolbox archiviert werden. Je nach Ihren Anforderungen benötigen Sie möglicherweise beide Konzepte in Ihren Archiven.
quelle
Ich habe die Antwort von @ Darkwaltz4 wegen ihrer Kürze übernommen und möchte mitteilen, wie ich die Lösung an Situationen angepasst habe, in denen das Array für jede Iteration unterschiedliche Schlüssel enthalten kann:
und pflegte einen "Hauptschlüssel" wie folgt:
array_merge hätte die Zusammenführung in der Array [1] -Iteration basierend auf $ master_key ausgeführt und für diese Iteration ['some_key'] = '', einen leeren Wert, erzeugt. Daher wurde array_intersect_key verwendet, um $ master_key in jeder Iteration wie folgt zu ändern:
quelle
Ein bisschen spät, aber ich konnte nicht finden, wie ich es implementiert habe. Diese Version muss geschlossen werden, php> = 5.3, könnte aber geändert werden, um nicht:
Natürlich muss 'dontSortMe' aussortiert werden und erscheint möglicherweise zuerst im Beispiel
quelle