Ordenação de array de objetos em PHP: por uma propriedade para iniciantes

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Ordenação de array de objetos em PHP: do caos à ordem em 5 minutos

\n\n

Imagine: você está criando um site educacional em PHP e recebeu uma lista de estudantes do banco de dados. Cada estudante é um objeto com nome, idade e pontuação. Você precisa exibi-los na página: primeiro os mais velhos, ou, ao contrário, os mais novos. Ou, talvez, ordenar em ordem alfabética. Como fazer isso se você não tem um array simples de números, mas um array de objetos?

\n\n

Esta pergunta é uma das mais populares no Stack Overflow. Milhares de desenvolvedores, de iniciantes a profissionais, enfrentam a tarefa de «sort array of objects by one property». E hoje vamos resolvê-la de uma vez por todas. Sem enrolação, com exemplos reais e explicações claras.

\n\n

Por que o sort() comum não funciona?

\n\n

Suponha que temos um 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("João", 20, 92),\n    new Student("Maria", 23, 78),\n    new Student("Pedro", 21, 95)\n];\n?>
\n\n

Se você tentar chamar sort($students), o PHP emitirá um erro ou simplesmente não fará nada. Por quê? Porque sort() sabe comparar números e strings, mas não sabe como comparar dois objetos. É preciso explicar: «Compare pela propriedade age» ou «Compare por name». Para isso, o PHP tem uma função especial — usort().

\n\n

Conheça: usort() — sua principal ferramenta

\n\n

A função usort() recebe dois argumentos: o próprio array e uma função de comparação. Esta função de comparação deve retornar:

\n
    \n
  • 0, se os elementos forem iguais;
  • \n
  • número negativo, se o primeiro elemento for menor que o segundo;
  • \n
  • número positivo, se o primeiro elemento for maior que o segundo.
  • \n
\n\n

Parece complicado? Na prática, é simples. Vamos ordenar os estudantes por idade (em ordem crescente):

\n\n
<?php\nusort($students, function($a, $b) {\n    return $a->age <=> $b->age;\n});\n\n// Resultado: João (20), Pedro (21), Ana (22), Maria (23)\n?>
\n\n

Observe o operador <=> (nave espacial). Ele surgiu no PHP 7 e torna a ordenação extremamente concisa. Ele compara dois valores e retorna -1, 0 ou 1. Exatamente o que o usort() precisa.

\n\n

Ordenação decrescente: invertendo o sinal

\n\n

Quer ordenar do mais velho para o mais novo? Basta inverter os operandos no operador <=>:

\n\n
<?php\nusort($students, function($a, $b) {\n    return $b->age <=> $a->age;  // agora b é comparado com a\n});\n\n// Resultado: Maria (23), Ana (22), Pedro (21), João (20)\n?>
\n\n

Ou, de forma equivalente, multiplique o resultado por -1:

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

Ordenação por strings (ordem alfabética)

\n\n

E se a propriedade for uma string? Por exemplo, o nome. O mesmo princípio, mas em vez de <=>, usamos strcmp() ou strcasecmp() (para comparação sem distinção de maiúsculas/minúsculas):

\n\n
<?php\n// Em ordem alfabética (A-Z)\nusort($students, function($a, $b) {\n    return strcmp($a->name, $b->name);\n});\n\n// Resultado: Ana, João, Maria, Pedro\n\n// Em ordem alfabética inversa (Z-A)\nusort($students, function($a, $b) {\n    return strcmp($b->name, $a->name);\n});\n?>
\n\n

Ordenação por propriedade numérica: alternativa ao <=>

\n\n

O operador <=> é conveniente, mas se você estiver trabalhando com PHP antigo (anterior ao 7.0), ele não existe. Nesse caso, escrevemos a comparação manualmente:

Blogs

Book Recommendations