No muy optimizado pero hace lo que quieres:
Código PHP:
function agruparNumeros($numeros, $rango)
{
$result = array();
foreach ($numeros as $numero)
{
$intervalo = array(
$numero - $rango,
$numero + $rango
);
$entras = array();
foreach ($result as $clave => $results)
{
if (in_array($numero, $results))
{
continue 2;
}
$init = reset($results);
$end = end($results);
if (
($intervalo[0] >= $init && $intervalo[0] <= $end) ||
($intervalo[1] >= $init && $intervalo[1] <= $end) ||
($intervalo[0] <= $init && $intervalo[1] >= $end)
)
{
$entras[] = $clave;
}
}
if ($entras)
{
$entra_principal = $entras[0];
unset($entras[0]);
$result[$entra_principal][] = $numero;
if (count($entras) >= 1)
{
foreach ($entras as $entra)
{
foreach ($result[$entra] as $valor)
{
$result[$entra_principal][] = $valor;
}
if ($entra != $entra_principal)
{
unset($result[$entra]);
}
}
}
}
else
{
$result[] = array($numero);
}
}
return $result;
}
function zerofill($numero, $longitud)
{
$return = $numero;
while (strlen($return) < $longitud)
{
$return = '0'.$return;
}
return $return;
}
function superorden($array, $rango = 30, $order = 'asc', $profundidad_order = 'full', $profundiad_rango = 'full')
{
$numeros_grupo = array();
$claves = array();
$zerofill = 0;
$profundidad_max = 0;
foreach ($array as $clave => $valor)
{
foreach (explode(',', $clave) as $grupo => $numero)
{
$numeros_grupo[$grupo][$clave] = $numero;
$claves[$clave][$grupo] = $numero;
if (strlen($numero) > $zerofill)
{
$zerofill = strlen($numero);
}
if (($grupo + 1) > $profundidad_max)
{
$profundidad_max = $grupo + 1;
}
}
}
// order
if ($profundidad_order == 'full' || $profundidad_order > $profundidad_max)
{
$profundidad_order = $profundidad_max;
}
elseif ($profundidad_order < 1)
{
$profundidad_order = 1;
}
// rango
if ($profundidad_rango == 'full' || $profundidad_rango > $profundidad_max)
{
$profundidad_rango = $profundidad_max;
}
elseif ($profundidad_rango < 1)
{
$profundidad_rango = 1;
}
switch ($order)
{
case 'desc':
$function_sort = 'arsort';
break;
case 'asc':
default:
$function_sort = 'asort';
}
$claves_global = array();
foreach ($numeros_grupo as $grupo => $numeros)
{
if ($profundidad_order < ($grupo + 1))
{
break;
}
$dorango = $profundidad_rango >= ($grupo + 1) ? true : false;
$order = array();
foreach ($numeros as $clave => $numero)
{
$order[$clave] = isset($claves_global[$clave]) ? $claves_global[$clave].zerofill($numero, $zerofill) : $numero;
}
$function_sort($order);
if ($dorango)
{
$medias = array();
foreach (agruparNumeros($numeros, $rango) as $agrupacion)
{
$media = round(array_sum($agrupacion) / count($agrupacion));
foreach ($agrupacion as $numero)
{
$medias[zerofill($numero, $zerofill)] = $media;
}
}
}
$claves_order = array();
foreach ($order as $clave => $numero)
{
$claves_order[] = $clave;
$i++;
if ($dorango)
{
$numero = zerofill($numero, $zerofill);
$numero = substr($numero, strlen($numero) - $zerofill);
$claves_global[$clave] .= zerofill($medias[$numero], $zerofill);
}
}
$return = array();
foreach ($claves_order as $clave)
{
$return[$clave] = $array[$clave];
}
}
return $return;
}
$array = array(
'221,79,75' => 3344,
'162,50,40' => 533,
'213,63,53' => 30,
'87,58,24' => 1073,
'79,45,62' => 1963,
'143,89,7' => 120,
'208,100,18' => 29,
'31,36,86' => 104,
'165,2,100' => 70,
'35,70,38' => 82,
'34,100,15' => 27,
'145,20,61' => 2,
'25,56,60' => 3,
'264,26,38' => 1,
'327,14,31' => 2,
'12,27,15' => 1
);
print_r(superorden($array, 30, 'asc', 2, 1));