Ordenar array por valor de columna en PHP: guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Por qué ordenar arrays asociativos es un dolor (y cómo solucionarlo)

\n\n

Imagina esto: extraes una lista de usuarios de la base de datos. Cada uno tiene nombre, edad, ciudad y puntuación. Los datos llegan como un array de arrays asociativos. Y entonces tu jefe dice: «Ordénalos por edad, y luego por puntuación en orden inverso». ¿Te suena familiar? Si alguna vez has programado en PHP, seguro te has enfrentado a la tarea de ordenar un array de arrays asociativos por el valor de una columna. Es una pregunta con miles de visitas en Stack Overflow, y no miente: es un verdadero dolor de cabeza para muchos desarrolladores.

\n\n

En este artículo, exploraremos todas las formas de ordenar arrays multidimensionales en PHP. Desde el simple usort hasta el potente array_multisort. Aprenderás a ordenar por un campo, por varios campos, en diferentes direcciones y cómo evitar errores comunes con tipos de datos. ¡Vamos allá!

\n\n

El problema: por qué sort() normal no funciona

\n\n

Supongamos que tenemos este array:

\n\n
<?php\n$users = [\n    ['name' => 'Ana', 'age' => 25, 'rating' => 4.7],\n    ['name' => 'Juan', 'age' => 30, 'rating' => 3.9],\n    ['name' => 'María', 'age' => 22, 'rating' => 4.9],\n];\n?>
\n\n

Si intentas sort($users), PHP mostrará una advertencia y dejará el array intacto. ¿Por qué? Porque sort() compara los elementos directamente, y PHP no sabe cómo comparar arrays asociativos. Necesita una pista: qué campo debe usar como criterio de ordenación.

\n\n

Método #1: usort() — el rey de la ordenación personalizada

\n\n

La función usort() recibe un array y una función callback que compara dos elementos. Es la forma más flexible y usada.

\n\n

Ordenar por un campo (ascendente)

\n\n
<?php\nusort($users, function($a, $b) {\n    return $a['age'] <=> $b['age'];\n});\n// Resultado: María (22), Ana (25), Juan (30)\n?>
\n\n

El operador <=> (nave espacial) llegó en PHP 7 y hace el código más limpio. Devuelve -1, 0 o 1 según la comparación. Si necesitas orden descendente, solo intercambia $a y $b:

\n\n
<?php\nusort($users, function($a, $b) {\n    return $b['age'] <=> $a['age'];\n});\n// Resultado: Juan (30), Ana (25), María (22)\n?>
\n\n

Ordenar por campo de texto

\n\n

Con cadenas funciona igual, pero recuerda la configuración regional. Si ordenas nombres en español, usa setlocale() y strcoll() para un manejo correcto de caracteres especiales:

\n\n
<?php\nsetlocale(LC_ALL, 'es_ES.UTF-8');\nusort($users, function($a, $b) {\n    return strcoll($a['name'], $b['name']);\n});\n?>
\n\n

Método #2: array_multisort() — para ordenar por varias columnas

\n\n

Cuando necesitas ordenar primero por un campo y luego por otro (por ejemplo, por ciudad y dentro de cada ciudad por edad), usort empieza a requerir lógica compleja. Aquí entra array_multisort().

\n\n

Ordenar por dos campos

\n\n
<?php\n$ages = array_column($users, 'age');\n$ratings = array_column($users, 'rating');\narray_multisort($ages, SORT_ASC, $ratings, SORT_DESC, $users);\n?>
\n\n

Analicemos la magia: creamos arrays separados con las columnas deseadas y luego los pasamos a array_multisort. Importante: el array original se pasa al final; se reordenará según el orden de los primeros arrays. Es una herramienta potente pero peligrosa: si las columnas tienen longitudes diferentes, obtendrás un error.

\n\n

Método #3: array_column() + sort() — un truco para una línea

\n\n

Si solo necesitas ordenar un array por un campo numérico, puedes combinar array_column() y array_multisort() en una sola línea:

\n\n
<?php\narray_multisort(array_column($users, 'age'), SORT_ASC, $users);\n?>
\n\n

Esto extrae la columna 'age', la ordena de forma ascendente y reordena el array original en consecuencia. Rápido y eficaz para casos simples.

Blogs

Book Recommendations