viernes, 21 de octubre de 2011

Funciones de ordenamiento en php

Veamos directamente las funciones disponibles para ordenar arrays.

sort()

Es la función más básica para ordenar arrays en PHP. Ordena el array de valores menores a mayores. Lo vemos con un ejemplo.

//Ordenar desde el menor al mayor
$alumnos = array("Pepe", "Juan", "Marcelo", "Alberto", "Gerardo");
sort($alumnos);
foreach ($alumnos as $key => $val) {
echo "alumnos[" . $key . "] = " . $val . "
";
}

Que dará como resultado:
alumnos[0] = Alberto
alumnos[1] = Gerardo
alumnos[2] = Juan
alumnos[3] = Marcelo
alumnos[4] = Pepe

rsort()

Esta función ordena el array por valores. La "r" delante quiere decir que ordena en orden reverso, de mayor a menor.

//ordenar de mayor a menor (orden inverso... Reverse order)
$alumnos = array("Pepe", "Juan", "Marcelo", "Alberto", "Gerardo");
rsort($alumnos);
foreach ($alumnos as $key => $val) {
echo "alumnos[" . $key . "] = " . $val . "
";
}

Que daría como respuesta:
alumnos[0] = Pepe
alumnos[1] = Marcelo
alumnos[2] = Juan
alumnos[3] = Gerardo
alumnos[4] = Alberto

ksort()

También podemos ordenar un array por el índice o llave, que quiere decir que en lugar de ordenar atendiendo a los valores, se ordenaría atendiendo al índice que tienen. Para ver este ejemplo utilizaremos arrays asociativos, que son los que tienen índices de texto en vez de números.

En el array siguiente vemos que tenemos índices como "h", "e", "a", en lugar de números. Lo que hará este tipo de ordenación es fijarse en esos índices para poner el array ordenado por ellos.

//Ordenar arrays por su índice
$calles = array("h"=>"Leganitos", "e"=>"Castellana", "a"=>"Bailén", "z"=>"Fuencarral");
ksort($calles);
foreach ($calles as $key => $val) {
echo $key ." = " . $val . "
";
}

Esto dará como resultado esta ordenación:
a = Bailén
e = Castellana
h = Leganitos
z = Fuencarral

krsort()

También podemos ordenar por índices pero en sentido inverso. Es decir, por índices pero de mayor a menor.

//ordenar por índice o clave, pero en orden inverso
$calles = array("h"=>"Leganitos", "e"=>"Castellana", "a"=>"Bailén", "z"=>"Fuencarral");
krsort($calles);
foreach ($calles as $key => $val) {
echo $key ." = " . $val . "
";
}

En este caso el resultado sería el siguiente:
z = Fuencarral
h = Leganitos
e = Castellana
a = Bailén

asort()

Esta función ordena los elementos de un array, pero manteniendo la correlación entre índices y valores a los que están asociados. Ordena por valores. Se utiliza generalmente en arrays asociativos.

//ordenar manteniendo los índices
$capitales = array("España" => "Madrid", "Argentina" => "Buenos Aires", "México" => "Ciudad de México", "Brasil" => "Brasilia");
asort($capitales);
foreach ($capitales as $key => $val) {
echo $key ." = " . $val . "
";
}

Dará como resultado el siguiente orden de array:
Brasil = Brasilia
Argentina = Buenos Aires
México = Ciudad de México
España = Madrid

arsort()

Es lo mismo que asort(), pero realiza el orden en inverso de los valores de los arrays. Como decíamos, lo habitual es realizar este tipo de orden en arrays asociativos, pero en este caso vamos a ver el orden en un array normal (con índices numéricos) para que se vea mejor cómo trabaja la función:

//ordenar manteniendo los índices, Reverso
$ciudades = array("Madrid", "Barcelona", "Valencia", "Sevilla", "Bilbao");
arsort($ciudades);
foreach ($ciudades as $key => $val) {
echo $key ." = " . $val . "
";
}

El resultado obtenido es este:
2 = Valencia
3 = Sevilla
0 = Madrid
4 = Bilbao
1 = Barcelona

natsort()

Para acabar vamos a ver esta función que hace una ordenación natural de los elementos del array, es decir, ordena tal como lo haría una persona. Hay una pequeña diferencia sobre el orden que haría sort(). La función natsort mantiene la asociación clave - valor.

$productos = array ("producto 11", "producto 1", "producto 12", "producto 2");
natsort($productos);
foreach ($productos as $key => $val) {
echo $key ." = " . $val . "
";
}

Esto daría como respuesta:
2 = producto 1
4 = producto 2
1 = producto 11
3 = producto 12
0 = producto 20

Ahora, para que se vea la diferencia con un orden normal, vamos a ordenar ese mismo array con la función sort(), que hace un orden alfanumérico normal.

$productos = array ("producto 11", "producto 1", "producto 12", "producto 2");
sort($productos);
foreach ($productos as $key => $val) {
echo $key ." = " . $val . "
";
}

El resultado de este orden será el siguiente:
0 = producto 1
1 = producto 11
2 = producto 12
3 = producto 2

Como se puede ver, el orden es distinto, porque en ese caso ordena por un orden alfanumérico estricto, sin tener en cuenta los valores como un humano lo haría.

ShareThis