Ordenar arrays multidimensionales en base a una clave asociativa con php

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'));

Sobre Asier

Arquitecto web enganchado al desarrollo, estudio y planteamiento de proyectos en internet. Trabajo en Blackslot, empresa que fundé en el 2009. Me encanta el cine, el café, el sexo, la cultura geek, la cultura oriental y la música electrónica.
Artículo publicado en Desarrollo Web, PHP. Enlace a esta entrada..

2 espuestas a Ordenar arrays multidimensionales en base a una clave asociativa con php

  1. Alberto de Tena dijo:

    Muchas gracias, muy util para un proyecto que tengo

  2. iñaki dijo:

    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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos requeridos, están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>