Mag Meld

Ordenar array bidimensional, matriz, en PHP

Publicado en programación, web por Lúgh en 4 octubre 2011

En principio PHP dispone de sort(), asort y ksort() para ordenar arrays normales, arrays asociativos (clave-valor), basándose en el valor, y arrays asociativos (clave-valor), basándose en la clave, respectivamente. Estas tres funciones ordenan de forma ascendente. Para ordenar de forma descendente se usaría para cada uno de los tipos de array rsort(), arsort() y krsort().

Antes de continuar veamos que son concretamente los arrays nombrados anteriormente y como se usan estas funciones.

Array normal

Imaginemos que queremos guardar la información de jugadores de baloncesto, su id, faltas cometidas y número de puntos en el último partido. Un array normal se trata de un array simple de la forma:

$jugador= {1,3,15};

Para ordenar alfabeticamente y ascendentemente usaremos

sort($jugador);

Para ordenar descendentemente:

rsort($jugador);

Después de eso utilizaríamos normalmente el array ordenado.

Array asociativo clave-valor

Son los array formados por un par clave-valor, siguiendo con el ejemplo anterior, de la forma:

$jugador = array{'id'=>1,'faltas'=>3,'puntos'=>15};

Para ordenar alfabeticamente y ascendentemente por el valor usaremos

asort($jugador);

Para ordenar descendentemente:

arsort($jugador);

Si queremos ordenar por la clave, en este caso sería una ordenación alfabética ascendente usaremos:

ksort($jugador);

Para ordenador descendentemente:

krsort($jugador);

Todo esto comentado nos sirve para matrices “simples” de una dimensión, pero ¿Qué pasa si queremos guardar en una única matriz los datos de todo el equipo?

Supongamos que tenemos un array de arrays, una matriz, con el siguiente contenido

$jugadores[0]["id"]=1;
$jugadores[0]["nombre"]='Pepe';
$jugadores[0]["faltas"]='3';
$jugadores[0]["puntos"]=15;

$jugadores[1]["id"]=2;
$jugadores[1]["nombre"]='Juan';
$jugadores[1]["faltas"]='2';
$jugadores[1]["puntos"]=14;

$jugadores[2]["id"]=3;
$jugadores[2]["nombre"]='Mario';
$jugadores[2]["faltas"]='5';
$jugadores[2]["puntos"]=28;

Para conseguir imprimir el contenido de esta matriz por pantalla ordenada podríamos implementar nosotros mismos un bucle que los fuera recorriendo una y otra vez hasta colocarlos correctamente, pero como he dicho, PHP ya dispone de soluciones para hacer este trabajo de una manera más eficiente. No es posible seguir utilizando las funciones anteriores del mismo modo pues nuestra matriz es algo más compleja y necesita que le digamos como comparar cada jugador para ordenarlo, de primeras no sabría que campo de cada uno de estos es por el que queremos ordenar.

Para solucionar esto existe la función usort, uasort() y uksort(). Para estos casos no hay reversas, debemos implementar dos funciones de comparación y llamar a usort utilizando como parámetro una u otra, dependiendo de si queresmos ordenar en un sentido u otro. Para este caso si queremos ordenar por puntos y de forma ascendente usaremos usort().

Lo primero será crear una función que indique entre dos términos cual es el mayor

//Función para ordenar ascendentemente
function cmpPuntosAsc($jugador1, $jugador2)
{
     //Si son iguales se devuelve 0
     if($jugador1["puntos"]==$jugador2["puntos"])
          return 0;
     //Si jugador1 > 2 se devuelve 1 y por lo contrario -1
     if($jugador1["puntos"]<$jugador2["puntos"])
          return -1;
     return 1;
}
//Función para ordenar descendentemente
function cmpPuntosDesc($jugador1, $jugador2)
{
     //Si son iguales se devuelve 0
     if($jugador1["puntos"]==$jugador2["puntos"])
          return 0;
     //Si jugador1 > 2 se devuelve 1 y por lo contrario -1
     if($jugador1["puntos"]<$jugador2["puntos"])
          return 1;
     return -1;
}

Para ordenar los jugadores ascendentemente por sus puntos haremos

usort($jugadores,"cmpPuntosAsc");

Para ordenar descendentemente llamaremos a

usort($jugadores,"cmpPuntosDesc");

Después de esto utilizaremos el array normalmente llamando a cada elemento por el indice ($jugadores[0], $jugadores[1]…) donde se encontrará ordenado.

Algo así:

$nJugadores=count($jugadores);
$index=0;
echo "Ranking de puntos";
while($index<$nJugadores)
{
     echo $jugadores[$index]["nombre"];
     $index++;
}

Ordenar array bidimensional, matriz, en PHP” creado y publicado originalmente en MagMeld (http://magmeld.wordpress.com)

Advertisement
Etiquetado con:, ,

Una respuesta

Suscríbete a los comentarios mediante RSS.

  1. La pagina de tu Blog se ha actualizado…

    [..]Articulo Indexado Correctamente en la Blogosfera de Sysmaya[..]…


Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

Seguir

Get every new post delivered to your Inbox.