Tendrás que implementar algún algorismo de ordenación en PHP y modificarlo levemente para hacer eso. Por google he encontrado el algorismo de ordenación por fusión (también llamado mergesort):
Código PHP:
<?php
function mergesort($arr) {
$sl = round((count($arr)/2));
$sr = count($arr)-$sl;
$l = array_slice($arr, 0, $sl);
$r = array_slice($arr, $sl);
if($sl > 1) {
$l = self::mergesort($l);
}
if($sr > 1) {
$r = self::mergesort($r);
}
$res = self::merge($l, $r);
return $res;
}
function merge($l, $r) {
$lc = $rc = $mc = 0;
$res = array();
$cl = count($l);
$cr = count($r);
while($lc < $cl && $rc < $cr) {
if($l[$lc] < $r[$rc]) {
$res[$mc++] = $l[$lc++];
}
else {
$res[$mc++] = $r[$rc++];
}
}
$cl_t = count($l);
while($lc < $cl_t) {
$res[$mc++] = $l[$lc++];
}
$cr_t = count($r);
while($rc < $cr_t) {
$res[$mc++] = $r[$rc++];
}
return $res;
}
?>
Por si no lo conoces, es del tipo "divide y vencerás" y además estable. Se trata de ir diviendo el array por dos y así sucesivamente hasta obtener array's de un sólo elemento. Luego como toda función recursiva vuelve al proceso inverso y van quedando conjuntos de array's ordenados que se fusionan (obviamente, un array con un único elemento siempre está ordenado) y va creciendo hasta quedar de nuevo tu array original y ordenado.
Sólo deberás aplicarle cuatro cambios para que ordene por $top[$c][$promedio].