Wie Array sortieren
tipper
- php
0 misterunknown0 dedlfix
Hallo zusammen,
ich verzweifele zur Zeit beim sortieren eines mehrdimensionalen Arrays.
Array
(
[0] => Array
(
[points] => Array
(
[points_amount] => 74
[four_pointer] => 7
[two_pointer] => 13
)
[gname] => Spieler
[sname] => 1
)
[1] => Array
(
[points] => Array
(
[points_amount] => 45
[four_pointer] => 4
[two_pointer] => 4
)
[gname] => Spieler
[sname] => 2
)
[2] => Array
(
[points] => Array
(
[points_amount] => 73
[four_pointer] => 8
[two_pointer] => 13
)
[gname] => Spieler
[sname] => 3
)
[3] => Array
(
[points] => Array
(
[points_amount] => 70
[four_pointer] => 10
[two_pointer] => 6
)
[gname] => Spieler
[sname] => 4
)
[4] => Array
(
[points] => Array
(
[points_amount] => 73
[four_pointer] => 8
[two_pointer] => 6
)
[gname] => Spieler
[sname] => 5
)
[5] => Array
(
[points] => Array
(
[points_amount] => 51
[four_pointer] => 3
[two_pointer] => 4
)
[gname] => Spieler
[sname] => 6
)
)
Ich möchtenun eine Tabelle ausgeben, wo die Spieler nach points_amount, four_pointer, two_pointer sortiert sind. Also in diesem Fall:
1. Spieler 1 | 74 | 07 | 13
2. Spieler 3 | 73 | 08 | 13
3. Spieler 5 | 73 | 08 | 6
4. Spieler 4 | 70 | 10 | 6
5. Spieler 6 | 51 | 03 | 4
6. Spieler 2 | 45 | 04 | 4
ich blicke aber bei den sortierfunktionen bei PHP absolut nicht durch, welches wäre die richtige für dieses Problem?
Bin für jede Hilfe dankbar
Grüße
tipper
Moin,
ich blicke aber bei den sortierfunktionen bei PHP absolut nicht durch, welches wäre die richtige für dieses Problem?
Ich hatte das selbe Problem und hab eine Funktion gefunden, die funktioniert hat:
function array_sort($array, $on, $order=SORT_ASC) {
$new_array = array();
$sortable_array = array();
if (count($array) > 0) {
foreach ($array as $k => $v) {
if (is_array($v)) {
foreach ($v as $k2 => $v2) {
if ($k2 == $on) {
$sortable_array[$k] = $v2;
}
}
} else {
$sortable_array[$k] = $v;
}
}
switch ($order) {
case SORT_ASC:
asort($sortable_array);
break;
case SORT_DESC:
arsort($sortable_array);
break;
}
foreach ($sortable_array as $k => $v) {
$new_array[$k] = $array[$k];
}
}
return $new_array;
}
Woher, weiß ich leider nicht mehr.
$array => das zu sortierende Array
$on => Sortierkriterium
$order => SORT_ASC | SORT_DESC (auf- oder absteigend)
Grüße Marco
Moin!
ich blicke aber bei den sortierfunktionen bei PHP absolut nicht durch, welches wäre die richtige für dieses Problem?
Ich hatte das selbe Problem und hab eine Funktion gefunden, die funktioniert hat:
Für welches Sortierproblem?
Nur weil "Sortierfunktion" draufsteht, heißt das noch lange nicht, dass damit das Problem gelöst ist.
Woher, weiß ich leider nicht mehr.
$array => das zu sortierende Array
$on => Sortierkriterium
$order => SORT_ASC | SORT_DESC (auf- oder absteigend)
Wenn du nicht weißt und angeben kannst, welche Input-Struktur erforderlich ist, und welcher Output zu erwarten ist, schmeiß den Code lieber weg...
- Sven Rautenberg
Moin,
Wenn du nicht weißt und angeben kannst, welche Input-Struktur erforderlich ist, und welcher Output zu erwarten ist, schmeiß den Code lieber weg...
Langsam... Code wegschmeißen? Soll ich jedesmal, wenn ich so ein Array sortieren will zu Fuß gehen? Sicher nicht.
Ich habe viele solche Arrays, deren assoziativen Datensätze hinter einem Index liegen, also in der Form:
Array(
[0] => Array ( [id] => 123 [name] => "name" ...)
[1] => Array ( [id] => 1234 ...)
...
)
Und diese lassen sich mit der Funktion sehr gut sortieren. Was ich allerdings in diesem konkreten Fall nicht bedacht habe, ist, dass die Sortierkriterien noch eine Stufe weiter unten zu finden sind. Dafür lässt sich die Funktion aber anpassen.
Grüße Marco
Tach!
Langsam... Code wegschmeißen? Soll ich jedesmal, wenn ich so ein Array sortieren will zu Fuß gehen? Sicher nicht.
Der Aufwand, das zu Fuß zu machen, hält sich sehr in Grenzen und es ist weniger Aufwand, als das Array dreimal umzuformen:
uasort(
$array,
function($a, $b) {
return strcmp($a['irgend']['ein']['key'], $b['irgend']['ein']['key']);
}
);
Variationsmöglichkeiten:
dedlfix.
Moin,
uasort(
$array,
function($a, $b) {
return strcmp($a['irgend']['ein']['key'], $b['irgend']['ein']['key']);
}
);
Man wird alt wie ein Haus, ... :-P
Das kannte ich noch nicht, danke.
Grüße Marco
Tach!
ich verzweifele zur Zeit beim sortieren eines mehrdimensionalen Arrays.
Die Bezeichung "mehrdimensionales Array" für baumstrukturierte Daten ist irreführend und auch nicht korrekt. Konkret hast du ein Array mit Datensätzen. Diese sind assoziative Arrays und haben (vielleicht sogar unnötigerweise) einen Eintrag, der weitere Daten in Form eines weiteren assoziativen Arrays bündelt. Also ein Baum und kein in mehrere Dimensionen gleichmäßig strebendes Gebilde.
ich blicke aber bei den sortierfunktionen bei PHP absolut nicht durch, welches wäre die richtige für dieses Problem?
Solche Strukturen kann man nun beliebig verästeln und es wäre ein Unding, für alle möglichen Strukturen eine Sortierfunktion bereitzustellen. Deshalb gibt es neben den für einfache Arrays geeigneten Sortierfunktionen die u-Varianten, denen man eine benutzerdefinierte Vergleichsfunktion übergeben kann. In dieser bekommst du jeweils zwei Elemente des Arrays und vergleichst da die für dich relevanten Einträge. (array_multisort() gibts auch noch, aber das lass mal lieber unbeachtet. Es arbeitet mit einer realtiv ungebräuchlichen Datenstruktur und ist für deine nicht direkt verwendbar.)
dedlfix.