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?
>> hmm, usort en sort zijn inderdaad de verkeerde functies. uasort en arsort zijn de juiste.

Ja, dat zei ik dus ;)

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

Klopt. Met true en false werkt het overigens ook. Wat ik nu heb gedaan is dit:


<?php
uasort($languages, function ($a, $b) {
$cmp = max($b) - max($a);
return $cmp > 0 ? 1 : -1;
});
?>
Ik geef nooit 0 terug, want volgens mij heeft dat geen zin.

Maar hoe ik het nu aanpak, is dat oké? Dus eerst een uasort en dan een foreach loop?
Of kan dat anders?

Jij had het namelijk ook over array_map?

* edit: foutje in code hersteld
Ik hoop niet dat je een return in een expressie hebt gestopt?

<?php
uasort($languages, function ($a, $b) {
return (max($b) - max($a)) > 0 ? 1 : -1;
});

$languages = array_map(function ($i) {
arsort($i);

return $i;
}, $languages);
?>

En zie hier meteen het lelijke van "by reference" argumenten. Als dit namelijk gewone goede functies waren geweest, dus functies die input krijgen en output teruggeven, zou de code veel mooier en makkelijker zijn geweest:
<?php
$languages = array_map('arsort', uasort($languages, function ($a, $b) {
return max($b) > max($a) ? 1 : -1;
}));
?>
>> Ik hoop niet dat je een return in een expressie hebt gestopt?

In het voorbeeldje wel zie ik. Ik ga het gelijk aanpassen. Ik heb in de echte code nog een tussenstap. Als max($b) - max($a) gelijk is aan 0, dan maak ik een nieuwe vergelijking en ga ik de gemiddeldes tegen elkaar afwegen. Vandaar dat ik het niet in 1x return zoals in jouw voorbeeld, maar zo:

<?php
uasort($languages, function ($a, $b) {
$cmp = max($b) - max($a);
if ($cmp === 0) $cmp = (array_sum($b) / count($b)) - (array_sum($a) / count($a));
return $cmp > 0 ? 1 : -1;
});
?>
Vervolgens doe ik dan dit:

<?php
foreach ($languages as $k => $v) arsort($languages[$k]);
?>
Jij gebruikt in plaats daarvan array_map. Is het een "beter" dan het ander? Zit er verschil in?

Reageren