Jose J. Fernández Programador. Desarrollador web y SEO en León

Ordenar arrays en PHP manteniendo las claves

Jose J. Fernández

Desarrollando una nueva feature para el proyecto que podeis ver en la columna de la derecha de este blog (ese de las chicas curvys), me encontré con la necesidad de ordenar arrays manteniendo las claves. Existe una función en PHP que ordena los arrays, la función sort(), pero destruye las claves que hubiera antes. Es decir, que las claves siempre pasarán a ser 1, 2, 3…

Y eso a veces no sirve.

Para mover tanto los valores como las claves, ordenando el array según los valores, y manteniendo las claves asociadas a éstos, usaremos la función asort(). No es que sea una función muy rebuscada, es sólo que yo no la conocía y anotándola no la olvidaré fácilmente :)

Te pongo un ejemplo. Declaramos este array:

$a = array(
	7 => 2,
	6 => 7,
	4 => 3,
	13 => 1,
	3 => 4
);

Si hacemos print_r(), se ve lo siguiente:

Array
(
    [7] => 2
    [6] => 7
    [4] => 3
    [13] => 1
    [3] => 4
)

Vamos a ordenar el array ahora.

Ordenar el array con sort()

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 7
)

Si te fijas, las claves que había se han sobreescrito por otras nuevas correlativas. Esto puede o no ser de utilidad, en mi caso no lo era y necesitaba mantener las claves asociadas a cada valor. asort() al rescate…

Ordenar el array con asort()

Array
(
    [13] => 1
    [7] => 2
    [4] => 3
    [3] => 4
    [6] => 7
)

Y ahí lo tenemos. Las mismas claves que teníamos antes, cambiadas de lugar, ordenadas según el valor con el que están asociadas.

¿Cómo recorremos fácilmente este array? Idealmente, con foreach, pero podemos recurrir a un for desde $inicio hasta $fin, siendo éstos los números que estimemos que habrá en el array, y haciendo isset() sobre cada elemento para comprobar que exista antes de acceder a él y evitar así errores de offset no definido. Mucho más lento y propenso a errores, pero en algún caso puede ser de utilidad, ¿no?

No se mostrará públicamente.

Un enlace a tu blog o página web.