Ver Mensaje Individual
  #12 (permalink)  
Antiguo 19/05/2003, 18:46
Avatar de BVis
BVis
 
Fecha de Ingreso: noviembre-2002
Ubicación: Barcelona
Mensajes: 104
Antigüedad: 22 años
Puntos: 0
Bueno, pues ya la he hecho, aunque al final ha sido más complicado de lo que creía...supongo que pensando un poco más daría con una solución más sencilla, pero ésto es lo que he conseguido hacer...

La función devolverá FALSE en caso de que los parámetros no sean correctos. En caso contrario, obtendremos el array de entrada ordenadito, por tantos campos le hayamos indicado.

Son las 2 de la mañana y tengo que madrugar, así que si algo falla, me lo decís y mañana le pego un repaso al tema si puedo.

Código PHP:
function ordenar_array() {
  
$n_parametros func_num_args(); // Obenemos el número de parámetros
  
if ($n_parametros<|| $n_parametros%2!=1) { // Si tenemos el número de parametro mal...
    
return false;
  } else { 
// Hasta aquí todo correcto...veamos si los parámetros tienen lo que debe ser...
    
$arg_list func_get_args();

    if (!(
is_array($arg_list[0]) && is_array(current($arg_list[0])))) {
      return 
false// Si el primero no es un array...MALO!
    
}
    for (
$i 1$i<$n_parametros$i++) { // Miramos que el resto de parámetros tb estén bien...
      
if ($i%2!=0) {// Parámetro impar...tiene que ser un campo del array...
        
if (!array_key_exists($arg_list[$i], current($arg_list[0]))) {
          return 
false;
        }
      } else { 
// Par, no falla...si no es SORT_ASC o SORT_DESC...a la calle!
        
if ($arg_list[$i]!=SORT_ASC && $arg_list[$i]!=SORT_DESC) {
          return 
false;
        }
      }
    }
    
$array_salida $arg_list[0];

    
// Una vez los parámetros se que están bien, procederé a ordenar...
    
$a_evaluar "foreach (\$array_salida as \$fila){\n";
    for (
$i=1$i<$n_parametros$i+=2) { // Ahora por cada columna...
      
$a_evaluar .= "  \$campo{$i}[] = \$fila['$arg_list[$i]'];\n";
    }
    
$a_evaluar .= "}\n";
    
$a_evaluar .= "array_multisort(\n";
    for (
$i=1$i<$n_parametros$i+=2) { // Ahora por cada elemento...
      
$a_evaluar .= "  \$campo{$i}, SORT_REGULAR, \$arg_list[".($i+1)."],\n";
    }
    
$a_evaluar .= "  \$array_salida);";
    
// La verdad es que es más complicado de lo que creía en principio... :)

    
eval($a_evaluar);
    return 
$array_salida;
  }
}

// EJEMPLO DE USO:
$array_a_ordenar = array(
                 
=> array('campo1' => 'patatas''campo2' => 1'campo3' => 'kkkk'),
                 
=> array('campo1' => 'coles''campo2' => 3'campo3' => 'aaaa'),
                 
=> array('campo1' => 'tomates''campo2' => 1'campo3' => 'zzzz'),
                 
=> array('campo1' => 'peras''campo2' => 7'campo3' => 'hhhh'),
                 
=> array('campo1' => 'tomates''campo2' => 4'campo3' => 'bbbb'),
                 
=> array('campo1' => 'aguacates''campo2' => 3'campo3' => 'yyyy'),
         );

$array_ordenadito ordenar_array($array_a_ordenar'campo2'SORT_DESC'campo1'SORT_DESC) or die('<br>ERROR!<br>'); 
Cluster, cuando vea que funciona como debe, lo subiré a las FAQ, o si tienes tiempo y ganas súbelo tú mismo.

Ea, un saludo.
__________________
"Yo opino lo mismo que BVis, el de 'forosdelweb' " - Bill Gates

Última edición por BVis; 19/05/2003 a las 18:52