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?