Hoi mensen, ik heb een lastige array die ik wil sorteren. Ik heb alleen geen idee hoe.

<?php

test1
highest_score => 20
sub_scores
foo => 80
bar => 20

test2
highest_score => 90
sub_scores
foobar => 10
bazbaz => 90

?>
Wat ik nu wil is dat de array wordt gesorteerd 1) op highest_score en 2) op sub_scores, dus zo:

<?php

test2
highest_score => 90
sub_scores
bazbaz => 90
foobar => 10

test1
highest_score => 20
sub_scores
foo => 80
bar => 20

?>
Hoe moet ik dit aanpakken?
Dummy code:
$newArray = [php]array_map[/php]([php]sort[/php], [php]usort[/php]($oldArray))
Wouter... dankjewel... ik snap alleen niet hoe ik dit moet invullen. Zijn dit de letterlijke functies die ik moet gebruiken? Dit levert null op, dus ik denk dat je iets anders bedoelt en dat ik het verkeerd begrijp.
Kijk naar de documentatie van die functies, bekijk de voorbeelden. Pas ze toe en je komt eruit.
Wil iemand me hierbij helpen? Ik kom er niet uit.
Waar loop je vast? Wat heb je geprobeerd? Waar heb je op gezocht?
Ik heb het opgelost met een uasort en vervolgens een foreach loop.

Jouw array_map krijg ik niet werkend. En met sort en usort verlies je sowieso de array-keys, dus dat kan ook niet werken. Het probleem is in ieder geval opgelost, hoewel ik ook benieuwd ben naar jouw oplossing

$newArray = array_map(sort, usort($oldArray))

Ik krijg hier in ieder geval niks zinnigs uit.
Dat kan best kloppen, aangezien sort een functie is en dus of tussen strings of met () gebruikt moet worden. Ook heeft usort 2 argumenten, terwijl die in de code 1 argument heeft. Misschien was dat ook wel de rede dat er "dummy code" staat, ik geef een opzetje en jij maakt hem af.

Laten we het dan maar in kleine stapjes doen. Als je niet goed bent in het lezen van de documentatie:
- Eerst sorteren op highest_score. Kijk naar [php]usort[/php] en wat de user functie daar allemaal mag returnen en wat resultaat dat opleverd.
- Dan nog eens sorteren op een child van deze array. We lopen dus even netjes door de array en dan moeten we het nog eens op waarde sorteren. Kijk eens naar [php]sort[/php] om te kijken of je daar misschien wat mee kunt. (vast wel, want ik ga je geen valse tips geven..)
Het ging om een language array. Die highest score heb ik weggelaten en nu ziet de array er zo uit:


array(2) {
  ["en"]=>
  array(2) {
    ["us"]=>
    int(20)
    ["en"]=>
    int(30)
  }
  ["nl"]=>
  array(1) {
    ["nl"]=>
    int(100)
  }
}

Hij moet er echter zo uitzien:


array(2) {
  ["nl"]=>
  array(1) {
    ["nl"]=>
    int(100)
  }
  ["en"]=>
  array(2) {
    ["en"]=>
    int(30)
    ["us"]=>
    int(20)
  }
}

Ik heb daar de volgende code voor gebruikt en die werkt prima:

<?php
uasort($languages, function ($a, $b) {
return max($b) - max($a);
});
foreach ($languages as $k => $v) arsort($languages[$k]);
?>
Wat betreft jouw usort en sort zie ik niet hoe dat gaat werken, omdat je daarmee de array-keys verliest. Ik ben dus benieuwd of jij een betere oplossing weet dan de mijne.



Wouter, ik ben nog steeds erg benieuwd naar jouw oplossing met sort en usort...
hmm, usort en sort zijn inderdaad de verkeerde functies. uasort en arsort zijn de juiste.

Jouw uasort user functie is echter niet correct. Hij moet -1, 0 of 1 teruggeven.

Reageren