1. Code
  2. Coding Fundamentals

Wie man Arrays in PHP sortiert

Scroll to top

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:

  1. SORT_REGULAR - Hiermit werden die Werte sortiert, ohne dass ihre Typen geändert werden.
  2. SORT_NUMERIC - Hiermit werden die Werte sortiert, indem sie numerisch verglichen werden.
  3. SORT_STRING - Hiermit werden die Werte sortiert, indem sie als Zeichenfolgen verglichen werden.
  4. SORT_LOCALE_STRING - Hiermit werden die Werte als Zeichenfolge basierend auf dem aktuellen Gebietsschema verglichen. Sie können das Gebietsschema selbst mit setlocale() aktualisieren.
  5. SORT_NATURAL - Hiermit werden die Elemente in "natürlicher Reihenfolge" sortiert, während sie als Zeichenfolgen verglichen werden.
  6. SORT_FLAG_CASE - Dies kann mit SORT_STRING oder SORT_NATURAL kombiniert 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.