Sortieren Sie ein Array nach Schlüsseln basierend auf einem anderen Array?
Lesezeit: 6 Minuten
Alex
Ist es in PHP möglich, so etwas zu tun? Wie würden Sie vorgehen, um eine Funktion zu 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';
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 es scheint, dass Sie nur alphabetisch oder numerisch sortieren können.
Dunkelwalzer4
Benutz einfach array_merge oder array_replace. array_merge funktioniert, indem Sie mit dem Array beginnen, das Sie ihm geben (in der richtigen Reihenfolge) und die Schlüssel mit Daten aus Ihrem tatsächlichen Array überschreiben/hinzufügen:
$customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';
$properOrderedArray = array_merge(array_flip(array('name', 'dob', 'address')), $customer);
// or
$properOrderedArray = array_replace(array_flip(array('name', 'dob', 'address')), $customer);
// $properOrderedArray: array(
// 'name' => 'Tim',
// 'dob' => '12/08/1986',
// 'address' => '123 fake st',
// 'dontSortMe' => 'this value doesnt need to be sorted')
PS: Ich beantworte diese “abgestandene” Frage, weil ich denke, dass alle Schleifen, die als vorherige Antworten gegeben wurden, übertrieben sind.
Es funktioniert gut, wenn Sie Zeichenfolgenschlüssel haben, aber nicht für die numerischen. PHP Docs: „Wenn die Eingabe-Arrays die gleichen String-Schlüssel haben, dann überschreibt der spätere Wert für diesen Schlüssel den vorherigen. Wenn die Arrays jedoch numerische Schlüssel enthalten, wird der spätere Wert den ursprünglichen Wert nicht überschreiben, wird es aber angehängt.”
– bolbol
7. November 2012 um 6:52 Uhr
Schön, aber was ist, wenn die Schlüssel nicht in den Werten vorhanden sind? Ich brauche das, aber nur, wenn einer der Schlüssel existiert … Brauche dann wahrscheinlich einen Foreach darauf …
– Solomon Closson
8. Mai 2014 um 22:49 Uhr
In meinem Fall ist es array_replace anstelle von array_merge. array_merge kombiniert beide Werte, anstatt das zweite Array durch die geordneten Schlüssel zu ersetzen.
– neofreko
12. November 2014 um 6:26 Uhr
Ich bin vor ein paar Jahren auf der Suche nach etwas anderem auf Ihre Lösung gestoßen – und dachte mir, das ist im Vergleich zu den Schleifen äußerst effizient. Jetzt brauche ich Ihre Lösung und ich habe eine Stunde lang gesucht, um sie wieder zu finden! Danke!
– Michael
13. November 2017 um 3:29 Uhr
Wenn das Array ‘order’ (dh array(‘name’, ‘dob’, ‘address’)) mehr Schlüssel als das zu sortierende Array hat, würde zusätzlich array_intersect des resultierenden sortierten Arrays mit dem ursprünglichen Array abgeschnitten streunende Schlüssel, die bei array_merge hinzugefügt wurden.
– bbe
8. Januar 2018 um 10:24 Uhr
Eran Galperin
Los geht’s:
function sortArrayByArray(array $array, array $orderArray) {
$ordered = array();
foreach ($orderArray as $key) {
if (array_key_exists($key, $array)) {
$ordered[$key] = $array[$key];
unset($array[$key]);
}
}
return $ordered + $array;
}
Sie können also 2 Arrays mit einem +-Zeichen verbinden? Ich wusste nie, dass ich verwendet habe array_merge()!
– Alex
24. September 2009 um 23:08 Uhr
Ist das besser als mit usort() oder uasort()?
– Grantwparks
25. September 2009 um 19:57 Uhr
Sie sollten ein einfügen break Anweisung, sobald der Wert gefunden wurde.
– Adel
26. September 2011 um 14:50 Uhr
@alex Seien Sie sehr vorsichtig, wenn Sie ersetzen array_merge() mit dem Array + Operator. Es fügt per Taste (auch für numerische Tasten) und von zusammen links nach rechtswährend array_merge verschmilzt aus rechts nach links und überschreibt niemals numerische Tasten. Z.B [0,1,2]+[0,5,6,7] = [0,1,2,7] während array_merge([0,1,2],[0,5,6,7]) = [0,1,2,0,5,6,7] und ['a' => 5] + ['a' => 7] = ['a' => 5] aber array_merge(['a' => 5], ['a' => 7]) = ['a' => 7].
Das ist nicht sehr effizient. Für jeden Vergleich werden zwei lineare Suchen im Array durchgeführt. Nehmen wir an, die Zeitkomplexität von uksort() sei O(n * log n)dann läuft dieser Algorithmus ein O(n^2 * log(n)).
– Der Betreiber
23. Januar 2020 um 9:12 Uhr
Diese Lösungen funktionieren ziemlich gut für Arrays, denen ein Wert in der Sortierreihenfolge fehlt. Für kleine Arrays ist die Komplexität wahrscheinlich vernachlässigbar. Die Lösungen mit mehreren Array-Funktionen könnten sogar noch schlechter sein.
– 2. Kauboy
27. Juli 2021 um 15:56 Uhr
Ein anderer Weg für PHP >= 5.3.0:
$customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';
$customerSorted = array_replace(array_flip(array('name', 'dob', 'address')), $customer);
Ergebnis:
Array (
[name] => Tim
[dob] => 12/08/1986
[address] => 123 fake st
[dontSortMe] => this value doesnt need to be sorted
)
Funktioniert gut mit Zeichenfolgen und numerischen Tasten.
So entfernen Sie Elemente aus $array, die nicht in $keys aufgeführt sind, die ich verwendet habe: array_replace(array_fill_keys($keys, null), array_intersect_key($array, array_flip($keys)));
– Vlad Savitsky
22. Januar 2021 um 13:49 Uhr
Ich weiß nicht, wann ich dies positiv bewertet habe, aber ich bin zurück und wünschte, ich könnte erneut positiv bewerten: D Im Gegensatz zu jeder anderen Lösung array_flip() Diese Antwort funktioniert, wenn die Werte keine Skalare sind.
– Jessica
19. Januar um 21:57 Uhr
9897300cookie-checkSortieren Sie ein Array nach Schlüsseln basierend auf einem anderen Array?yes