Con esta función se puede ordenar un array BIDIMENSIONAL por uno o varios campos (columnas), tanto ascendentemente como descendentemente.
La forma de llamarla es:
Código PHP:
$array_ordenado = ordenar_array($array_a_ordenar, primer_campo_por_el_que_ordenar, asc_desc [,siguiente_campo_por_el_que_ordenar, asc_desc]*) ;
Donde $array_a_ordenar tiene la siguiente escructura:
Código PHP:
$array_a_ordenar[0]['nombre']='Ester Colero';
$array_a_ordenar[0]['telefono']='94727834';
$array_a_ordenar[0]['edad']=20;
$array_a_ordenar[0]['vivo']=true;
$array_a_ordenar[1]['nombre']='Pancho Colate';
$array_a_ordenar[1]['telefono']='93524864';
$array_a_ordenar[1]['edad']=24;
$array_a_ordenar[0]['vivo']=false;
los campos se deben corresponder a alguna columna, [en el ejemplo: 'nombre', 'telefono', 'edad' y/o 'vivo'].
Así pues este caso, habría 4 posibles columnas por las que ordenar.
asc_desc puede valer o bien: SORT_ASC o bien SORT_DESC ¡SIN COMILLAS! pues son valores constantes.
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.
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:
// Otra manera de declarar un array bidimensional de estos...
$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>');
$array_ordenadito2 = ordenar_array($array_a_ordenar, 'campo3', SORT_DESC, 'campo2', SORT_DESC, 'campo1', SORT_ASC ) or die('<br>ERROR!<br>');
Un saludo.