Ver Mensaje Individual
  #3 (permalink)  
Antiguo 06/12/2007, 05:57
Sanubrio
 
Fecha de Ingreso: septiembre-2007
Mensajes: 220
Antigüedad: 16 años, 7 meses
Puntos: 1
Re: ordenar con ksort() y dos criterios yuxtapuestos

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($numerostrlen($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($array30'asc'21));