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<3 || $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(
0 => array('campo1' => 'patatas', 'campo2' => 1, 'campo3' => 'kkkk'),
1 => array('campo1' => 'coles', 'campo2' => 3, 'campo3' => 'aaaa'),
2 => array('campo1' => 'tomates', 'campo2' => 1, 'campo3' => 'zzzz'),
3 => array('campo1' => 'peras', 'campo2' => 7, 'campo3' => 'hhhh'),
4 => array('campo1' => 'tomates', 'campo2' => 4, 'campo3' => 'bbbb'),
5 => 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.