sort($array) ordena um array em ordem crescente, no lugar. Ele altera a variável que você passa e retorna true, então você o chama numa linha sozinho e depois usa o array. rsort() ordena em ordem decrescente.
O PHP tem uma função de ordenação para cada combinação de "por valor ou por chave", "crescente ou decrescente" e "manter as chaves ou não":
| Função | Ordena por | Ordem | Chaves |
|---|---|---|---|
sort | valor | crescente | renumeradas 0, 1, 2 |
rsort | valor | decrescente | renumeradas |
asort | valor | crescente | mantidas |
arsort | valor | decrescente | mantidas |
ksort | chave | crescente | mantidas |
krsort | chave | decrescente | mantidas |
usort | sua função | você escolhe | renumeradas |
uasort | sua função | você escolhe | mantidas |
uksort | sua função nas chaves | você escolhe | mantidas |
Ordenar um array associativo por valor
sort() num array associativo joga as chaves fora. Use asort() para ordenar por valor mantendo cada chave com seu valor, ou arsort() para os maiores primeiro.
Ordenar um array por chave com ksort
ksort() ordena pela chave, krsort() pela chave em ordem inversa. É útil antes de imprimir configurações ou montar uma query string numa ordem estável.
Ordem personalizada com usort e o operador spaceship
usort($array, $callback) deixa você decidir a ordem. O callback recebe dois elementos e retorna um número negativo se o primeiro deve vir antes, um número positivo se o segundo deve vir antes, e 0 se forem iguais. O operador spaceship <=> retorna exatamente isso.
banana e cherry têm o mesmo tamanho, então o callback retorna 0 para elas e elas ficam na ordem em que já estavam. A ordenação do PHP é estável desde o PHP 8.0: elementos iguais mantêm a ordem anterior.
Ordenar um array multidimensional por um valor
Para ordenar uma lista de linhas por um campo, compare esse campo no usort. Para ordenar por dois campos, compare arrays: <=> os compara elemento por elemento, então o segundo campo só desempata o primeiro.
A segunda comparação coloca $b["age"] do lado esquerdo e $a["age"] do lado direito, o que inverte só a ordem da idade. array_multisort(array_column($people, 'city'), SORT_ASC, array_column($people, 'age'), SORT_DESC, $people) dá a mesma ordem sem callback: ele ordena pelas colunas extraídas e reordena $people para acompanhar.
Ordem natural e flags de ordenação
Por padrão, o PHP compara números como números e strings como strings. Nomes de arquivos com números dentro ficam numa ordem que as pessoas não esperam: img10 vem antes de img2, e todo nome com maiúscula vem antes de todo nome com minúscula. As flags mudam como os valores são comparados.
SORT_NATURAL lê sequências de dígitos como números, SORT_FLAG_CASE ignora maiúsculas e minúsculas, e SORT_STRING força uma comparação caractere a caractere mesmo para strings numéricas. natsort() e natcasesort() seguem a mesma ideia, mas mantêm as chaves.
Erro comum: atribuir o resultado do sort
Toda função de ordenação retorna true e altera o array que você passa. Atribuir o valor de retorno perde o array:
Se você precisa de uma cópia ordenada e quer manter o original, copie o array para uma nova variável antes e ordene a cópia, como o exemplo do asort acima faz com $copy.
Perguntas frequentes
Por que o sort() retorna true em vez do array ordenado?
As funções de ordenação do PHP ordenam o array no lugar, por referência, e retornam true. Chame sort($arr); numa linha sozinho e use $arr depois. Escrever $arr = sort($arr); substitui o seu array por true.
Como ordeno um array associativo por valor mantendo as chaves?
Use asort($arr) para ordem crescente ou arsort($arr) para decrescente. sort() e rsort() também ordenam por valor, mas jogam as chaves fora e renumeram a partir de 0.
Como ordeno um array multidimensional por um valor no PHP?
Use usort com o operador spaceship no campo: usort($rows, fn($a, $b) => $a['age'] <=> $b['age']);. Troque $a e $b para ordem decrescente, e compare arrays como [$a['city'], $a['age']] <=> [$b['city'], $b['age']] para ordenar por dois campos.
A ordenação do PHP é estável?
Sim, desde o PHP 8.0 todas as funções de ordenação são estáveis: elementos que comparam como iguais mantêm a ordem que tinham antes da ordenação. É isso que faz ordenar por um campo e depois por outro funcionar como esperado.
Como ordeno strings com números em ordem natural?
Use natsort($arr) ou sort($arr, SORT_NATURAL), que colocam img2 antes de img10. Adicione SORT_FLAG_CASE (SORT_NATURAL | SORT_FLAG_CASE) ou use natcasesort para ignorar maiúsculas e minúsculas.