Ordenar array por valor de coluna em PHP: guia completo

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

Por que ordenar arrays associativos é um desafio (e como resolvê-lo)

\n\n

Imagine: você extraiu uma lista de usuários do banco de dados. Cada um tem nome, idade, cidade e avaliação. Os dados chegaram como um array de arrays associativos. E então o chefe diz: "Ordene por idade e depois por avaliação em ordem decrescente". Situação familiar? Se você já programou em PHP, certamente já enfrentou a tarefa de: ordenar um array de arrays associativos pelo valor de uma coluna. Uma pergunta com milhares de visualizações no Stack Overflow não mente — é um verdadeiro obstáculo para muitos desenvolvedores.

\n\n

Neste artigo, vamos explorar todas as formas de ordenar arrays multidimensionais em PHP. Desde o simples usort até o poderoso array_multisort. Você aprenderá a ordenar por um campo, por vários campos, em diferentes direções e como evitar armadilhas com tipos de dados. Vamos nessa!

\n\n

O problema: por que o sort() comum não funciona

\n\n

Suponha que temos o seguinte array:

\n\n
<?php\n$users = [\n    ['name' => 'Ana', 'age' => 25, 'rating' => 4.7],\n    ['name' => 'João', 'age' => 30, 'rating' => 3.9],\n    ['name' => 'Maria', 'age' => 22, 'rating' => 4.9],\n];\n?>
\n\n

Se tentarmos sort($users), o PHP exibirá um aviso e deixará o array intacto. Por quê? Porque sort() compara os elementos diretamente, e o PHP não sabe como comparar arrays associativos. Ele precisa de uma dica — qual campo deve ser usado como critério de ordenação.

\n\n

Método #1: usort() — o rei da ordenação personalizada

\n\n

A função usort() recebe um array e uma função de callback que compara dois elementos. É a forma mais flexível e mais utilizada.

\n\n

Ordenação por um campo (crescente)

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

O operador <=> (nave espacial) foi introduzido no PHP 7 e torna o código mais limpo. Ele retorna -1, 0 ou 1 dependendo da comparação. Se precisar em ordem decrescente, basta inverter $a e $b:

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

Ordenação por campo de string

\n\n

Com strings funciona da mesma forma, mas é importante lembrar da localidade. Se você estiver ordenando nomes em português, use setlocale() e strcoll() para lidar corretamente com acentos e caracteres especiais:

\n\n
<?php\nsetlocale(LC_ALL, 'pt_BR.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 várias colunas

\n\n

Quando você precisa ordenar primeiro por um campo e depois por outro (por exemplo, por cidade e, dentro da cidade, por idade), o usort começa a exigir lógica complexa. É aí que o array_multisort() entra em cena.

\n\n

Ordenação por dois 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

Vamos desvendar a mágica: criamos arrays separados com as colunas desejadas e os passamos para o array_multisort. Importante: o array original é passado por último — ele será reordenado de acordo com a ordem dos primeiros arrays. É uma ferramenta poderosa, mas perigosa: se as colunas tiverem tamanhos diferentes, você receberá um erro.

\n\n

Método #3: array_column() + sort() — um truque para one-liners

\n\n

Se você só precisa ordenar um array por um campo numérico, pode usar a combinação de array_column() e array_multisort() em uma única linha:

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

Isso extrai a coluna 'age', ordena os valores e reordena o array original de acordo. Simples e eficiente para casos básicos.

Blogs

Book Recommendations