Mehrdimensionales Array sortieren -- kompliziert
Sebastian
- php
Hi,
ich habe ein Array der Form:
$arr[0][abc]=def
$arr[0][xyz]=abc
$arr[1][abc]=42
$arr[1][xyz]=24
Ich möchte, dass das Array sortiert wird, und zwar nach numerisch aufsteigender Art. Dabei soll $arr[.][importance] als Vergleichspunkt heransgezogen werden.
Wie mache ich das? Ich glaube, ich habe die Funktionsweise von array_multisort noch nicht verstanden, oder es geht damit nicht. Bitte um Hilfe!
Liebe Grüße,
Sebastian
Moin!
ich habe ein Array der Form:
$arr[0][abc]=def
$arr[0][xyz]=abc
$arr[1][abc]=42
$arr[1][xyz]=24Ich möchte, dass das Array sortiert wird, und zwar nach numerisch aufsteigender Art. Dabei soll $arr[.][importance] als Vergleichspunkt heransgezogen werden.
Könntest du diesen Punkt mal etwas genauer beleuchten? Was soll rauskommen?
- Sven Rautenberg
Hi,
Könntest du diesen Punkt mal etwas genauer beleuchten? Was soll rauskommen?
Rauskommen soll folgendes:
Wenn ich erst hatte:
$arr[0][importance]=9
$arr[0][irgendwas]='bla1'
$arr[1][importance]=5
$arr[1][irgendwas]='bla2'
$arr[2][importance]=1
$arr[2][irgendwas]='bla3'
$arr[2][importance]=4
$arr[2][irgendwas]='bla4'
soll daraus werden:
$arr[0][importance]=1
$arr[0][irgendwas]='bla3'
$arr[1][importance]=4
$arr[1][irgendwas]='bla4'
$arr[2][importance]=5
$arr[2][irgendwas]='bla2'
$arr[3][importance]=9
$arr[3][irgendwas]='bla1'
Versteht Ihr mein Problem?
Liebe Grüße,
Sebastian
Hi,
$arr[2][importance]=4
$arr[2][irgendwas]='bla4'
Tippfehler, sollte jeweisl $arr[3] heißen. Sorry
Liebe Grüße,
Sebastian
Moin!
Könntest du diesen Punkt mal etwas genauer beleuchten? Was soll rauskommen?
Versteht Ihr mein Problem?
Ja, sonnenklar.
Als Anregung zum selberdenken:
Du willst $arr sortieren. Du brauchst eine benutzerdefinierte Vergleichfunktion, welche die einzelnen Elemente von $arr vergleicht.
Diese Vergleichsfunktion erhält jeweils zwei Elemente aus $arr.
Ein Element aus $arr ist beispielsweise der Inhalt von $arr[0]. Dies ist ein Array.
Also vergleichst du in der Funktion $element1[importance] mit $element2[importance], und gibst -1, 0 oder 1 zurück, je nachdem, was kleiner ist.
array_multisort brauchst du dafür nicht.
- Sven Rautenberg
Hi,
Danke für die Antwort!
Ja, sonnenklar.
Als Anregung zum selberdenken:
Du willst $arr sortieren. Du brauchst eine benutzerdefinierte Vergleichfunktion, welche die einzelnen Elemente von $arr vergleicht.
Diese Vergleichsfunktion erhält jeweils zwei Elemente aus $arr.
Aber ich hab doch mehr als zwei Elemente. Sogar beliebig viele. Irgendwie komm ich nicht ganz darauf, was ich machen müsste.
Liebe Grüße,
Sebastian
Moin!
Als Anregung zum selberdenken:
Du willst $arr sortieren. Du brauchst eine benutzerdefinierte Vergleichfunktion, welche die einzelnen Elemente von $arr vergleicht.
Diese Vergleichsfunktion erhält jeweils zwei Elemente aus $arr.
Aber ich hab doch mehr als zwei Elemente. Sogar beliebig viele. Irgendwie komm ich nicht ganz darauf, was ich machen müsste.
Sortieren ist ein beständiges Vergleichen und ggf. vertauschen von zwei Elementen aus dem Array.
Es gibt verschiedene Algorithmen, die unterschiedlich schnell sind, weil sie je nach Ansatz mehr oder weniger Vergleiche und Vertauschungen haben. Aber alle benötigen die Information, ob das eine Vergleichselement kleiner als das andere ist oder nicht.
Nehmen wir mal Bubblesort als Algorithmustyp. Diese Art des Sortierens ist die langsamste, aber am verständlichsten für Anfänger:
Angenommen, du hast 5 Elemente in deinem Array. Nehmen wir Integer-Zahlen:
8 4 9 1 4
Bubblesort vergleicht zuerst das erste Element nacheinenander mit dem zweiten, dritten, vierten und fünften, und wenn das hintere Element kleiner ist, als das vordere Element, werden beide getauscht. Ich mach mal klammern um die jeweils verglichenen Elemente und kommentiere:
(8) (4) 9 1 4 // 4 ist kleiner als 8, aber hinten, also tauschen.
(4) 8 (9) 1 4 // 9 ist größer, also nicht tauschen
(4) 8 9 (1) 4 // 1 ist kleiner und hinten, also tauschen
(1) 8 9 4 (4) // 4 ist größer als 1, also nicht tauschen.
Am Ende dieses Durchlaufs steht das kleinste Element ganz vorne, und dahinter unsortiert nur Elemente, die größer sind.
Also wird jetzt mit den Array-Elementen 2 bis 5 nochmal sortiert. Das drösel ich jetzt nicht ganz bis zum Ende auf. :)
Du siehst hoffentlich: Damit der Algorighmus weiß, ob er tauschen muß, werden jeweils zwei Elemente des Arrays wertmäßig verglichen.
Und genau diesen Vergleich kannst du bei der Funktion usort() manuell in einer Funktion bestimmen.
Und die Beschreibung für usort() enthält als Beispiel 2 genau deinen Fall.
- Sven Rautenberg
Hi,
Und die Beschreibung für usort() enthält als Beispiel 2 genau deinen Fall.
Dankeschön.
Liebe Grüße,
Sebastian