komplexes array sortieren in php?
-
also, ich hab ain array:
$test=array(); $test[]=array('id' => 13,'name' => "Klaus",'punkte' => 15); $test[]=array('id' => 14,'name' => "Hans",'punkte' => 13); $test[]=array('id' => 15,'name' => "Hans",'punkte' => 2);
und nun will ich dieses array anhand mehrerer spalten sortieren. Ich mein damit, dass man zb zuerst das array nach den namen sortiert, und danach die gleichen einträge nach punkten. Weis jemand, ob es dazu eine standardfunktion in php gibt, die man benutzen kann? ich hab jetzt ne weile gesucht, und dachte mit array_multisort das gefunden zu haben, was ich brauchte, aber der sortiert ja nach zeilen, und nicht nach spalten. Und das array selber ist zu groß, um es noch umzusortieren.
-
es gibt ksort, sort, etc..
du kannst nach key und nach value sortieren..bedenke: ein array ist ein hash in php, bei gleichem key nur ein eintrag..
so überleg, was am sinnvollsten ist für deine aktion
-
sonnst gibt es immer noch usort. Mit usort kannst du Arrays mit einer von dir
selbst geschriebenen Funktion umsortieren. Schau dir dazu am besten mal die Docu auf www.php.net an.
-
elise schrieb:
es gibt ksort, sort, etc..
du kannst nach key und nach value sortieren..bedenke: ein array ist ein hash in php, bei gleichem key nur ein eintrag..
so überleg, was am sinnvollsten ist für deine aktiondie bin ich alle durch.
bei den sorts bei denen ich nach value sortiere, hab ich keine(!) einflussmöglichkeit darauf zu sagen:sortiere nur nach diesem wert, oder nur nach dem andren, wenn der value ein weiterer wert ist.
usort funktioniert auch nicht so gut, da ich der funktion selber noch die information darüber übergeben muss, nach welchen spalten sortiert werden soll, und ich hab keine ahnung, wie das anzustellen ist.(immerhin kann ich im gegensatz zu c++ keinen functor übergeben)
-
otze schrieb:
(immerhin kann ich im gegensatz zu c++ keinen functor übergeben)
Falsch. Und hättest du die Dokumentation gelesen, auf die du verwiesen wurdest, wüsstest du das.
-
Dasd schrieb:
otze schrieb:
(immerhin kann ich im gegensatz zu c++ keinen functor übergeben)
Falsch. Und hättest du die Dokumentation gelesen, auf die du verwiesen wurdest, wüsstest du das.
falsch. es wird zwar auf memberfunktionen eingegangen, die stehen aber im direkten zusammenhang zu den objekten die verglichen werden sollen. die doku hab ich schon gründlich gelesen.
-
Ich verstehe dein Problem nicht.
function my_sort(&$arr) { function cmp($a, $b) { for ($i = 0; $i < sizeof($GLOBALS['___SORT::sort_order']); $i++) { $testa = $a[$GLOBALS['___SORT::sort_order'][$i]]; $testb = $b[$GLOBALS['___SORT::sort_order'][$i]]; if ($testa != $testb) { if (is_string($testa) || is_string($testb)) { return strcmp($testa, $testb); } return ($testa > $testb) ? 1 : -1; } } return 0; } $GLOBALS['___SORT::sort_order'] = func_get_args(); array_shift($GLOBALS['___SORT::sort_order']); usort($arr, "cmp"); } $test=array(); $test[]=array('id' => 14,'name' => "Hans", 'punkte' => 13); $test[]=array('id' => 15,'name' => "Hans", 'punkte' => 2); $test[]=array('id' => 13,'name' => "Klaus",'punkte' => 15); var_dump($test); my_sort($test, 'name', 'punkte'); var_dump($test);
Funktioniert bei mir einwandfrei. Ist natürlich nicht schön, sich in Globals einzuhacken, aber für die Grundidee ok.
[Edit]
Hatte noch einen Fehler drin. Ist jetzt korrigiert.
[/Edit]