Algunas veces disponemos de un array que contiene a su vez varios arrays asociativos, que contienen por ejemplo datos obtenidos tras una consulta a la base de datos.
Puede que dicho array esté cacheado y no queramos atacar a la base de datos para ordenar esos resultados, por lo que nos vendría genial poder ordenar los arrays asociativos que contenga dicho array, en base a los valores que contenga una de las claves de los mismos.
Lo vemos más claro en un ejemplo. Tenemos el siguiente array:
$resultados = array( array( 'id' => 1, 'nombre' => 'Enjuto', 'apellido' => 'Mojamuto' ), array( 'id' => 2, 'nombre' => 'Marlo', 'apellido' => 'Brando' ) );
En php disponemos de la función usort(), que ordena en base a una función de comparación que nosotros especifiquemos.
Por ejemplo si quisiéramos ordenar en base a la clave id, en orden descendiente, la función sería:
function comparar($x, $y){
if ( $x['id'] == $y['id'] )
return 0;
else if ( $x['id'] > $y['id'] )
return -1;
else
return 1;
}
Y ahora llamamos a usort para que utilice dicha función:
//si no estamos en un entorno Orientado a Objetos
usort($resultados, array('comparar'));
//si estamos en un entorno Orientado a Objetos
usort($resultados, array('nombreDeClase','comparar'));
Noviembre 15th, 2008 at 2:24 pm
Muchas gracias, muy util para un proyecto que tengo
Enero 23rd, 2009 at 6:27 pm
hola, buen articulo, pero no me funciona, y yo quiero algo similar.
quiero ordenar una lista de libros con titulo, autor y editorial por el titulo.
//lo que tengo es lo siguiente:
$biblioteca=array(
“El médico”=>array(
“autor”=>”NoahGordon”,
“editorial”=>”Time Warner”),
“Marina”=>array(
“autor”=>”Carlos Ruíz Zafón”,
“editorial”=>”Edebé”)
);
//tambien podria ponerlo así el array:
$biblioteca=array(
array(
“titulo”=>”El médico”,
“autor”=>”Noah Gordon”,
“editorial”=>”Time Warner”),
array(
“titulo”=>”Marina”,
“autor”=>”Carlos Ruíz Zafón”,
“editorial”=>”Edebé”)
);
//y para mostrarlo usando el segundo array en una tabla uso:
for($j=0;$j<2;$j++){
echo”
“.$biblioteca[$j]["titulo"].”
“.$biblioteca[$j]["autor"].”
“.$biblioteca[$j]["editorial"].”
“;
}
//con el resto de etiquetas html para la tabla, por supuesto.
//antes del bucle for uso el codigo de esta misma página:
function comparar($x, $y){
if ( $x['titulo'] == $y['titulo'] )
return 0;
else if ( $x['titulo'] > $y['titulo'] )
return -1;
else
return 1;}
usort($biblioteca, array(’comparar’));
// pero me da un error:
Warning: usort() [function.usort]: Invalid comparison function. in XXXX.php on line YY.
//Esa linea es:
usort($biblioteca, array(’comparar’));
muchas gracias