Wie man Arrays in PHP sortiert
German (Deutsch) translation by Tatsiana Bochkareva (you can also view the original English article)
Es ist immer einfacher, eine bestimmte Information aus sortierten Daten abzurufen, andernfalls müssen Sie jedes Element des Arrays einzeln durchgehen. Angenommen, Sie haben die Punktzahl verschiedener Schüler in einer Klasse in einem Array oder einer Tabelle gespeichert. Wenn die Daten nicht nach den erzielten Punktzahlen sortiert sind, müssen Sie sich die Punktzahl jedes Schülers in der Klasse ansehen, bevor Sie feststellen können, wer die höchste und niedrigste Punktzahl erhalten hat. Wenn die Tabelle bereits auf der Grundlage der Punktzahl von niedrig nach hoch sortiert war, würde ein Blick auf die Punktzahl des ersten Schülers die niedrigste Note ergeben.
Durch das Sortieren sind viele Aufgaben, die den Zugriff auf oder das Abrufen eines bestimmten Datensatzes erfordern, sehr einfach und effizient. In diesem Tutorial erfahren Sie, wie Sie mithilfe der integrierten PHP-Funktionen verschiedene Arten von Arrays sortieren.
Sortieren eines Arrays nach Wert
Das Sortieren eines Arrays nach dem Wert seiner Elemente ist in PHP sehr einfach. Sie können festlegen, ob Schlüsselwertzuordnungen beibehalten oder verworfen werden sollen, und Sie können auch Ihre eigenen Funktionen definieren, um festzulegen, wie Elemente sortiert werden. Ich werde Ihnen in diesem Abschnitt des Tutorials zeigen, wie.
Mit der Funktion sort(&$array, $sort_flags) können Sie die Werte eines Arrays von niedrig nach hoch sortieren. Beim Sortieren des Arrays werden jedoch keine Schlüsselwertzuordnungen beibehalten. Anstelle einer einfachen Neuordnung werden sortierten Elementen neue Schlüssel zugewiesen. Mit dem optionalen zweiten Parameter können Sie festlegen, wie die Elemente sortiert werden sollen. Es kann sechs verschiedene Werte haben:
-
SORT_REGULAR- Hiermit werden die Werte sortiert, ohne dass ihre Typen geändert werden. -
SORT_NUMERIC- Hiermit werden die Werte sortiert, indem sie numerisch verglichen werden. -
SORT_STRING- Hiermit werden die Werte sortiert, indem sie als Zeichenfolgen verglichen werden. -
SORT_LOCALE_STRING- Hiermit werden die Werte als Zeichenfolge basierend auf dem aktuellen Gebietsschema verglichen. Sie können das Gebietsschema selbst mitsetlocale()aktualisieren. -
SORT_NATURAL- Hiermit werden die Elemente in "natürlicher Reihenfolge" sortiert, während sie als Zeichenfolgen verglichen werden. -
SORT_FLAG_CASE- Dies kann mitSORT_STRINGoderSORT_NATURALkombiniert werden, um die Groß- und Kleinschreibung beim Sortieren von Zeichenfolgen zu deaktivieren.
Im Folgenden finden Sie einige Sortierbeispiele, mit denen Sie den Unterschied zwischen allen Sortierflags schnell erkennen können.
1 |
<?php
|
2 |
|
3 |
$random_data = [32508, 98134, "234984", "3249832", "38", 123, "Apple"]; |
4 |
|
5 |
sort($random_data); |
6 |
echo "Regular Sorting — "; |
7 |
foreach($random_data as $element) { |
8 |
echo str_pad($element, 9)." "; |
9 |
}
|
10 |
// Regular Sorting — 38 123 32508 98134 234984 3249832 Apple
|
11 |
|
12 |
sort($random_data, SORT_NUMERIC); |
13 |
echo "\nNumeric Sorting — "; |
14 |
foreach($random_data as $element) { |
15 |
echo str_pad($element, 9)." "; |
16 |
}
|
17 |
// Numeric Sorting — Apple 38 123 32508 98134 234984 3249832
|
18 |
|
19 |
sort($random_data, SORT_STRING); |
20 |
echo "\nString Sorting — "; |
21 |
foreach($random_data as $element) { |
22 |
echo str_pad($element, 9)." "; |
23 |
}
|
24 |
// String Sorting — 123 234984 3249832 32508 38 98134 Apple
|
Im Beispiel der regulären Sortierung werden die numerischen Zeichenfolgen in ihre numerischen Werte konvertiert und entsprechend sortiert. Die Zeichenfolge "Apple" ist nicht numerisch, bleibt also unberührt und wird als Zeichenfolge verglichen.
Im zweiten Beispiel, der numerischen Sortierung, möchten wir, dass die Daten nach dem numerischen Wert sortiert werden, damit "Apple" in den numerischen Wert 0 konvertiert wird und an erster Stelle steht. Die restlichen Werte werden wie erwartet sortiert.
Im dritten Beispiel werden alle Werte als Zeichenfolgen behandelt. Dies bedeutet, dass anstatt den numerischen Wert von 123 oder 3249832 mit 38 zu vergleichen, sie als Zeichenfolgen verglichen werden - jeweils ein Zeichen. Da "1" vor "3" steht, wird der Wert 123 als niedriger als 38 angesehen.
Wenn Sie Ihre Array-Werte von hoch nach niedrig anstatt von niedrig nach hoch sortieren möchten, können Sie dies mit Hilfe der Funktion rsort() tun. Es akzeptiert dieselben Parameter wie sort(), sortiert die Werte jedoch in umgekehrter Reihenfolge. Es werden auch keine Schlüsselwertzuordnungen beibehalten, sodass es keine gute Wahl zum Sortieren von assoziativen Arrays ist.
Sortieren Sie ein assoziatives Array
Schlüsselwertzuordnungen werden wichtig, wenn Sie mit assoziativen Arrays arbeiten. Betrachten Sie das folgende Beispiel, in dem ein assoziatives Array verwendet wird, um den Namen verschiedener Personen und ihre Lieblingsfrucht zu speichern. Wenn Sie die Liste alphabetisch nach dem Namen der Früchte sortieren möchten, führt die Verwendung der Funktion sort() aus dem vorherigen Abschnitt zum Verlust der zugehörigen Schlüssel.
1 |
<?php
|
2 |
|
3 |
$fruit_preferences = ["James" => "Orange", "John" => "Banana", "Patricia" => "Apple", "Jennifer" => "Mango", "Mary" => "Grapes"]; |
4 |
|
5 |
echo "Before Sorting — \n"; |
6 |
foreach($fruit_preferences as $person=>$preference) { |
7 |
echo $person." likes ".$preference."\n"; |
8 |
}
|
9 |
|
10 |
/*
|
11 |
Before Sorting —
|
12 |
James likes Orange
|
13 |
John likes Banana
|
14 |
Patricia likes Apple
|
15 |
Jennifer likes Mango
|
16 |
Mary likes Grapes
|
17 |
*/
|
18 |
|
19 |
sort($fruit_preferences); |
20 |
|
21 |
echo "After Sorting — \n"; |
22 |
foreach($fruit_preferences as $person=>$preference) { |
23 |
echo $person." likes ".$preference."\n"; |
24 |
}
|
25 |
|
26 |
/*
|
27 |
After Sorting —
|
28 |
0 likes Apple
|
29 |
1 likes Banana
|
30 |
2 likes Grapes
|
31 |
3 likes Mango
|
32 |
4 likes Orange
|
33 |
*/
|
34 |
|
35 |
?>
|
Wie Sie sehen, haben wir nicht nur die Assoziation der Menschen mit ihren Lieblingsfrüchten verloren, sondern auch die Namen der verschiedenen Menschen. Jedem sortierten Wert wurde basierend auf seiner Position im sortierten Array ein neuer numerischer Index zugewiesen.
Um Ihnen bei der einfachen Lösung dieses Problems zu helfen, verfügt PHP über zwei verschiedene Funktionen, die die Schlüsselwertzuordnung beibehalten und Arrays nach ihren Werten sortieren. Diese beiden Funktionen sind asort() und arsort(). Das folgende Code-Snippet sortiert dasselbe Array $fruit_preferences, verwendet jedoch asort(), um dies zu tun.
1 |
<?php
|
2 |
|
3 |
$fruit_preferences = ["James" => "Orange", "John" => "Banana", "Patricia" => "Apple", "Jennifer" => "Mango", "Mary" => "Grapes"]; |
4 |
|
5 |
echo "Before Sorting — \n"; |
6 |
foreach($fruit_preferences as $person=>$preference) { |
7 |
echo $person." likes ".$preference."\n"; |
8 |
}
|
9 |
|
10 |
/*
|
11 |
Before Sorting —
|
12 |
James likes Orange
|
13 |
John likes Banana
|
14 |
Patricia likes Apple
|
15 |
Jennifer likes Mango
|
16 |
Mary likes Grapes
|
17 |
*/
|
18 |
|
19 |
asort($fruit_preferences); |
20 |
|
21 |
echo "After Sorting — \n"; |
22 |
foreach($fruit_preferences as $person=>$preference) { |
23 |
echo $person." likes ".$preference."\n"; |
24 |
}
|
25 |
|
26 |
/*
|
27 |
After Sorting —
|
28 |
Patricia likes Apple
|
29 |
John likes Banana
|
30 |
Mary likes Grapes
|
31 |
Jennifer likes Mango
|
32 |
James likes Orange
|
33 |
*/
|
34 |
|
35 |
?>
|
Wie aus dem obigen Beispiel hervorgeht, bewegt sich der Wert von Apple an die Spitze, während die Verbindung zu Patricia erhalten bleibt. Die Fruchtnamen können mit der Funktion arsort() genauso einfach umgekehrt sortiert werden.
Beide Funktionen akzeptieren dieselben Sortierflags wie der Wert ihres optionalen zweiten Parameters als sort() und rsort().
Sortieren von Array-Elementen nach Wert mit benutzerdefinierten Funktionen
Die vier Sortierfunktionen können Ihre allgemeinen Sortieranforderungen mithilfe verschiedener Flags problemlos erfüllen. Manchmal können Ihre Kriterien für den Vergleich der Array-Elemente jedoch unterschiedlich sein.
Nehmen wir an, Sie haben eine Reihe von zufälligen Wörtern, die alphabetisch sortiert werden müssen. Sie möchten sie jedoch auch nach ihrer Länge sortieren, bevor Sie sie alphabetisch sortieren. Zum Beispiel würde der Zoo nach der Apfel in traditioneller alphabetischer Sortierung kommen. Wenn Sie die kurzen Wörter vor den längeren anzeigen möchten, wird der Zoo vor dem Apfel angezeigt. In den gleichen Buchstaben würde der Affe aufgrund der alphabetischen Reihenfolge vor den Zoo kommen.
Grundsätzlich werden die Wörter zuerst nach ihrer Länge sortiert und dann werden die Wörter mit der gleichen Anzahl von Buchstaben innerhalb ihrer eigenen Gruppe alphabetisch sortiert. Diese Art der Sortierung ist nicht in PHP integriert, daher müssen wir unsere eigene Sortierfunktion schreiben.
In diesem Fall bietet PHP einige Funktionen, mit denen Sie das zu sortierende Array zusammen mit dem Namen Ihrer eigenen Sortierfunktion übergeben können.
Mit der Funktion usort() können Sie Array-Werte in regulären Arrays sortieren. In ähnlicher Weise können Sie die Funktion uasort() verwenden, um Werte in assoziativen Arrays zu sortieren und gleichzeitig Schlüsselwertzuordnungen beizubehalten.
Das folgende Codefragment zeigt eine Möglichkeit, dieses Verhalten zu erreichen.
1 |
<?php
|
2 |
|
3 |
$random_words = ["ape", "apple", "zoo", "pie", "elephant", "banana", "picnic", "eye"]; |
4 |
|
5 |
sort($random_words); |
6 |
echo "Regular Sort Function: \n"; |
7 |
foreach($random_words as $element) { |
8 |
echo str_pad($element, 9)." "; |
9 |
}
|
10 |
|
11 |
/*
|
12 |
Regular Sort Function:
|
13 |
ape apple banana elephant eye picnic pie zoo
|
14 |
*/
|
15 |
|
16 |
function custom_sort($word_a, $word_b) { |
17 |
if (strlen($word_a) < strlen($word_b)) { |
18 |
return -1; |
19 |
}
|
20 |
if (strlen($word_a) == strlen($word_b)) { |
21 |
return strcmp($word_a, $word_b); |
22 |
}
|
23 |
if (strlen($word_a) > strlen($word_b)) { |
24 |
return 1; |
25 |
}
|
26 |
}
|
27 |
|
28 |
usort($random_words, "custom_sort"); |
29 |
echo "\nCustom Sort Function: \n"; |
30 |
foreach($random_words as $element) { |
31 |
echo str_pad($element, 9)." "; |
32 |
}
|
33 |
|
34 |
/*
|
35 |
Custom Sort Function:
|
36 |
ape eye pie zoo apple banana picnic elephant
|
37 |
*/
|
38 |
|
39 |
?>
|
In den Rückruffunktionen für die benutzerdefinierte Sortierung müssen wir eine Ganzzahl kleiner als 0 zurückgeben, um anzuzeigen, dass der erste Wert kleiner als der zweite ist. Geben Sie 0 zurück, wenn der erste Wert dem zweiten entspricht. Geben Sie eine Ganzzahl größer als 0 zurück, wenn der erste Wert größer als der zweite ist.
Da unser primäres Sortierkriterium die Zeichenfolgenlänge war, geben wir direkt -1 zurück, wenn das erste Wort kürzer als das zweite ist. Ebenso geben wir direkt 1 zurück, wenn das erste Wort länger als das zweite ist. Wenn die beiden Wörter gleich lang sind, vergleichen wir sie alphabetisch mit der Funktion strcmp() und geben ihren Wert zurück.
Wie Sie in der Ausgabe sehen können, ordnet unsere benutzerdefinierte Sortierfunktion die Wörter genau so neu, wie wir es wollten.
Sortieren eines Arrays nach Schlüssel
Das Sortieren eines Arrays anhand seiner Schlüssel ist im Allgemeinen nützlich, wenn Sie mit assoziativen Arrays arbeiten. Beispielsweise verfügen Sie möglicherweise über ein Array mit Informationen zur Gesamtzahl der Flughäfen in verschiedenen Ländern. Angenommen, die Namen verschiedener Länder sind Schlüssel und die Anzahl der Flughäfen sind Werte, möchten Sie die Ländernamen möglicherweise alphabetisch sortieren. Dies ist mit den Funktionen ksort() und krsort() sehr einfach. Beide Funktionen behalten die Schlüssel-Wert-Zuordnung von Array-Elementen nach dem Sortieren bei. Die Funktion ksort() sortiert die Tasten von niedrig nach hoch und krsort() sortiert die Tasten von hoch nach niedrig.
Hier ist ein grundlegendes Sortierbeispiel:
1 |
<?php
|
2 |
|
3 |
$airport_count = ["United States" => 13513, "Brazil" => 4093, "Mexico" => 1714, "Canada" => 1467, "Russia" => 1218, "Argentina" => 1138, "Bolivia" => 855, "Colombia" => 836, "Paraguay" => 799, "Indonesia" => 673]; |
4 |
|
5 |
ksort($airport_count); |
6 |
|
7 |
foreach($airport_count as $country=>$count) { |
8 |
echo str_pad($country, 15)." ".$count."\n"; |
9 |
}
|
10 |
|
11 |
/*
|
12 |
Argentina 1138
|
13 |
Bolivia 855
|
14 |
Brazil 4093
|
15 |
Canada 1467
|
16 |
Colombia 836
|
17 |
Indonesia 673
|
18 |
Mexico 1714
|
19 |
Paraguay 799
|
20 |
Russia 1218
|
21 |
United States 13513
|
22 |
*/
|
23 |
|
24 |
?>
|
Sie können PHP auch ohne Ihre eigene benutzerdefinierte Funktion zum Sortieren von Array-Schlüsseln mit der Funktion uksort() bereitstellen. Genau wie bei usort() müssen Sie bei der Rückruffunktion in uksort() auch eine Ganzzahl kleiner als 0 zurückgeben, wenn der erste Schlüssel als kleiner als der zweite betrachtet wird, und eine Ganzzahl größer als 0, wenn der erste Schlüssel größer als der zweite ist. Diese Funktion verwaltet auch die Schlüsselwertzuordnung von Array-Elementen.
1 |
<?php
|
2 |
|
3 |
$airport_count = ["United States" => 13513, "Brazil" => 4093, "Mexico" => 1714, "Canada" => 1467, "Russia" => 1218, "Argentina" => 1138, "Bolivia" => 855, "Colombia" => 836, "Paraguay" => 799, "Indonesia" => 673]; |
4 |
|
5 |
function custom_sort($word_a, $word_b) { |
6 |
if (strlen($word_a) < strlen($word_b)) { |
7 |
return -1; |
8 |
}
|
9 |
if (strlen($word_a) == strlen($word_b)) { |
10 |
return strcmp($word_a, $word_b); |
11 |
}
|
12 |
if (strlen($word_a) > strlen($word_b)) { |
13 |
return 1; |
14 |
}
|
15 |
}
|
16 |
|
17 |
uksort($airport_count, "custom_sort"); |
18 |
|
19 |
foreach($airport_count as $country=>$count) { |
20 |
echo str_pad($country, 15)." ".$count."\n"; |
21 |
}
|
22 |
|
23 |
/*
|
24 |
Brazil 4093
|
25 |
Canada 1467
|
26 |
Mexico 1714
|
27 |
Russia 1218
|
28 |
Bolivia 855
|
29 |
Colombia 836
|
30 |
Paraguay 799
|
31 |
Argentina 1138
|
32 |
Indonesia 673
|
33 |
United States 13513
|
34 |
*/
|
35 |
|
36 |
?>
|
Im obigen Beispiel haben wir die benutzerdefinierte Sortierfunktion aus dem vorherigen Abschnitt verwendet, um den Namen von Ländern zuerst nach der Länge ihres Namens und dann alphabetisch zu sortieren.
Sortieren mehrdimensionaler Arrays in PHP
Im wirklichen Leben ist es viel üblicher, mit mehrdimensionalen Informationen umzugehen. Beispielsweise speichern die Institutionen die Noten aller Schüler in einer Vielzahl von Fächern in einer einzigen Tabelle, anstatt für jedes Fach neue Tabellen zu erstellen. Wenn Sie dieselben Informationen in PHP speichern müssen, würden Sie es auch vorziehen, ein mehrdimensionales Array anstelle eines separaten Arrays für jedes Thema zu verwenden.
In diesem Tutorial erfahren Sie, wie Sie ein mehrdimensionales Array anhand einer Liste der höchsten Gebäude der Welt sortieren. Unser Array enthält Informationen über den Namen des Gebäudes, die Stadt und das Land, in dem es sich befindet, die Anzahl der Stockwerke und die Gesamthöhe in Metern sowie das Jahr, in dem es gebaut wurde.
Wenn Sie die Werte in einem mehrdimensionalen Array basierend auf einem bestimmten Feld sortieren möchten, können Sie einfach die Funktion usort() verwenden. Das folgende Beispiel soll Ihnen helfen, diese Technik besser zu verstehen.
1 |
<?php
|
2 |
|
3 |
$tallest_buildings = [ |
4 |
["Building" => "Burj Khalifa","City" => "Dubai","Country" => "United Arab Emirates","Height" => 828,"Floors" => 163,"Year" => 2010], |
5 |
["Building" => "Shanghai Tower","City" => "Shanghai","Country" => "China","Height" => 632,"Floors" => 128,"Year" => 2015], |
6 |
["Building" => "Abraj Al-Bait Towers","City" => "Mecca","Country" => "Saudi Arabia","Height" => 601,"Floors" => 120,"Year" => 2012], |
7 |
["Building" => "Ping An Finance Center","City" => "Shenzhen","Country" => "China","Height" => 599,"Floors" => 115,"Year" => 2017], |
8 |
["Building" => "Lotte World Tower","City" => "Seoul","Country" => "South Korea" ,"Height" => 554,"Floors" => 123,"Year" => 2016] |
9 |
];
|
10 |
|
11 |
function storey_sort($building_a, $building_b) { |
12 |
return $building_a["Floors"] - $building_b["Floors"]; |
13 |
}
|
14 |
|
15 |
usort($tallest_buildings, "storey_sort"); |
16 |
|
17 |
foreach($tallest_buildings as $tall_building) { |
18 |
list($building, $city, $country, $height, $floors) = array_values($tall_building); |
19 |
echo $building." is in ".$city.", ".$country.". It is ".$height." meters tall with ".$floors." floors.\n"; |
20 |
}
|
21 |
|
22 |
/*
|
23 |
Ping An Finance Center is in Shenzhen, China. It is 599 meters tall with 115 floors.
|
24 |
Abraj Al-Bait Towers is in Mecca, Saudi Arabia. It is 601 meters tall with 120 floors.
|
25 |
Lotte World Tower is in Seoul, South Korea. It is 554 meters tall with 123 floors.
|
26 |
Shanghai Tower is in Shanghai, China. It is 632 meters tall with 128 floors.
|
27 |
Burj Khalifa is in Dubai, United Arab Emirates. It is 828 meters tall with 163 floors.
|
28 |
*/
|
29 |
|
30 |
?>
|
Im obigen Beispiel werden die Informationen zu jedem Gebäude in einem eigenen Array im Hauptarray $tallest_buildings gespeichert. Die Funktion storey_sort() subtrahiert einfach die Anzahl der Stockwerke im zweiten Gebäude vom ersten, um zu bestimmen, welches Gebäude nach unseren Kriterien kleiner ist. Wir müssen uns keine Sorgen machen, einen bestimmten negativen oder positiven Wert zurückzugeben, da alle negativen Werte kleiner und alle positiven Werte größer bedeuten.
Am Ende durchlaufen wir einfach das Hauptarray und drucken Informationen zu jedem Gebäude aus.
Abschließende Gedanken
In diesem Tutorial habe ich Ihnen einige verschiedene Funktionen in PHP gezeigt, mit denen Arrays entweder nach ihren Schlüsseln oder nach ihren Werten sortiert werden können. Wir haben auch gelernt, wie ein Array anhand seiner Schlüssel oder Werte mithilfe unserer eigenen benutzerdefinierten Sortierkriterien mithilfe der Funktionen uksrot() und uasort() sortiert wird. Im letzten Abschnitt wurde erläutert, wie alle Werte in einem mehrdimensionalen Array nur anhand eines bestimmten Felds sortiert werden.
Ich hoffe, Sie haben aus diesem Tutorial etwas Neues gelernt. Wenn Sie Fragen oder Anregungen haben, lassen Sie es mich bitte in den Kommentaren wissen. Am besten lernen Sie, indem Sie versuchen, eigene Beispiele zu erstellen und Arrays mithilfe dieser Funktionen zu sortieren.



