Ordenación de un array de objetos en PHP: por una propiedad para principiantes

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

Ordenación de un array de objetos en PHP: del caos al orden en 5 minutos

\n\n

Imagina: estás escribiendo un sitio web educativo en PHP y obtienes una lista de estudiantes desde la base de datos. Cada estudiante es un objeto con nombre, edad y puntuación. Necesitas mostrarlos en la página: primero los mayores, o al contrario, los más jóvenes. O quizás, ordenarlos alfabéticamente. ¿Cómo hacerlo si no tienes un array simple de números, sino un array de objetos?

\n\n

Esta pregunta es una de las más populares en Stack Overflow. Miles de desarrolladores, desde principiantes hasta profesionales, se enfrentan a la tarea de «sort array of objects by one property». Y hoy la resolveremos de una vez por todas. Sin rodeos, con ejemplos vivos y explicaciones claras.

\n\n

¿Por qué no funciona el sort() normal?

\n\n

Supongamos que tenemos un array de objetos $students:

\n\n
<?php\nclass Student {\n    public $name;\n    public $age;\n    public $score;\n\n    public function __construct($name, $age, $score) {\n        $this->name = $name;\n        $this->age = $age;\n        $this->score = $score;\n    }\n}\n\n$students = [\n    new Student("Ana", 22, 85),\n    new Student("Iván", 20, 92),\n    new Student("María", 23, 78),\n    new Student("Pedro", 21, 95)\n];\n?>
\n\n

Si intentas llamar a sort($students), PHP mostrará un error o simplemente no hará nada. ¿Por qué? Porque sort() sabe comparar números y cadenas, pero no sabe cómo comparar dos objetos. Necesita que le expliques: «Compara por la propiedad age» o «Compara por name». Para eso, PHP tiene una función especial: usort().

\n\n

Conoce a usort(): tu herramienta principal

\n\n

La función usort() recibe dos argumentos: el array mismo y una función de comparación. Esta función de comparación debe devolver:

\n
    \n
  • 0, si los elementos son iguales;
  • \n
  • un número negativo, si el primer elemento es menor que el segundo;
  • \n
  • un número positivo, si el primer elemento es mayor que el segundo.
  • \n
\n\n

¿Suena complicado? En realidad es simple. Vamos a ordenar a los estudiantes por edad (de menor a mayor):

\n\n
<?php\nusort($students, function($a, $b) {\n    return $a->age <=> $b->age;\n});\n\n// Resultado: Iván (20), Pedro (21), Ana (22), María (23)\n?>
\n\n

Observa el operador <=> (nave espacial). Apareció en PHP 7 y hace que la ordenación sea extremadamente concisa. Compara dos valores y devuelve -1, 0 o 1. Exactamente lo que necesita usort().

\n\n

Ordenación descendente: cambiamos el signo

\n\n

¿Quieres ordenar de mayor a menor? Simplemente intercambia los operandos en el operador <=>:

\n\n
<?php\nusort($students, function($a, $b) {\n    return $b->age <=> $a->age;  // ahora b se compara con a\n});\n\n// Resultado: María (23), Ana (22), Pedro (21), Iván (20)\n?>
\n\n

O, lo que es lo mismo, multiplica el resultado por -1:

\n\n
<?php\nusort($students, function($a, $b) {\n    return -($a->age <=> $b->age);\n});\n?>
\n\n

Ordenación por cadenas (alfabéticamente)

\n\n

¿Y si la propiedad es una cadena? Por ejemplo, el nombre. Mismo principio, pero en lugar de <=> usamos strcmp() o strcasecmp() (para comparación sin distinción de mayúsculas/minúsculas):

\n\n
<?php\n// Alfabéticamente (A-Z)\nusort($students, function($a, $b) {\n    return strcmp($a->name, $b->name);\n});\n\n// Resultado: Ana, Iván, María, Pedro\n\n// Alfabéticamente (Z-A) — orden inverso\nusort($students, function($a, $b) {\n    return strcmp($b->name, $a->name);\n});\n?>
\n\n

Ordenación por propiedad numérica: alternativa a <=>

\n\n

El operador <=> es práctico, pero si trabajas con PHP antiguo (anterior a 7.0), no existe. Entonces escribimos la comparación manualmente:

Blogs

Book Recommendations