Por qué ordenar arrays asociativos es un dolor (y cómo solucionarlo)
\n\nImagina 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\nEn 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á!
El problema: por qué sort() normal no funciona
\n\nSupongamos 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\nSi 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.
Método #1: usort() — el rey de la ordenación personalizada
\n\nLa función usort() recibe un array y una función callback que compara dos elementos. Es la forma más flexible y usada.
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\nEl 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:
<?php\nusort($users, function($a, $b) {\n return $b['age'] <=> $a['age'];\n});\n// Resultado: Juan (30), Ana (25), María (22)\n?>\n\nOrdenar por campo de texto
\n\nCon 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:
<?php\nsetlocale(LC_ALL, 'es_ES.UTF-8');\nusort($users, function($a, $b) {\n return strcoll($a['name'], $b['name']);\n});\n?>\n\nMétodo #2: array_multisort() — para ordenar por varias columnas
\n\nCuando 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().
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\nAnalicemos 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.
Método #3: array_column() + sort() — un truco para una línea
\n\nSi solo necesitas ordenar un array por un campo numérico, puedes combinar array_column() y array_multisort() en una sola línea:
<?php\narray_multisort(array_column($users, 'age'), SORT_ASC, $users);\n?>\n\nEsto extrae la columna 'age', la ordena de forma ascendente y reordena el array original en consecuencia. Rápido y eficaz para casos simples.