Ordenação de Arrays
Aprenda a ordenar arrays em PHP usando sort(), rsort(), asort(), ksort(), natsort() e usort() com exemplos práticos.
Introdução à Ordenação de Arrays em PHP
Um array em PHP é uma coleção de elementos armazenados e acessados por um índice (uma posição numérica) ou uma chave (um rótulo). Ordenar significa reorganizar esses elementos em uma ordem definida — crescente, decrescente, por valor, por chave ou pela sua própria regra.
Esta página aborda as funções de ordenação integradas do PHP, como cada uma delas se comporta e — igualmente importante — qual delas usar dependendo de se você se preocupa com chaves, valores ou uma ordem personalizada.
Como as funções de ordenação diferem
Duas perguntas determinam qual função você precisa:
- Ordenar por valor ou por chave? Listas simples (arrays indexados) são ordenadas por valor; arrays associativos podem ser ordenados por qualquer um dos dois.
- Manter a associação chave→valor?
sort()/rsort()descartam as chaves originais e reindexam a partir de0. As famíliasa*ek*preservam a associação.
| Função | Ordena por | Ordem | Mantém chaves? |
|---|---|---|---|
sort() | valor | crescente | não (reindexado) |
rsort() | valor | decrescente | não (reindexado) |
asort() | valor | crescente | sim |
arsort() | valor | decrescente | sim |
ksort() | chave | crescente | sim |
krsort() | chave | decrescente | sim |
usort() | valor (personalizado) | sua regra | não (reindexado) |
uasort() | valor (personalizado) | sua regra | sim |
uksort() | chave (personalizado) | sua regra | sim |
Todas essas funções ordenam o array no próprio lugar (elas mutam a variável que você passa) e retornam true em caso de sucesso, em vez de um novo array — um ponto de confusão comum para iniciantes.
Ordenando Arrays em Ordem Crescente
A função sort() ordena um array em ordem crescente: strings em ordem alfabética, números em ordem numérica. Ela modifica o array original no lugar e o reindexa a partir de 0, portanto qualquer chave original é perdida. Evite misturar tipos de dados em um array, pois comparações entre strings e números, por exemplo, podem produzir resultados surpreendentes.
$fruits = ['lemon', 'orange', 'banana', 'apple'];
sort($fruits);
print_r($fruits);
// Output: Array ( [0] => apple [1] => banana [2] => lemon [3] => orange )Ordenando Arrays em Ordem Decrescente
A função rsort() é o inverso de sort() — ela ordena os elementos do maior para o menor. Assim como sort(), funciona no lugar e reindexa o array.
$numbers = [5, 2, 9, 1, 7];
rsort($numbers);
print_r($numbers);
// Output: Array ( [0] => 9 [1] => 7 [2] => 5 [3] => 2 [4] => 1 )Ordenando Arrays Associativos por Valor
Quando as chaves têm significado (nomes, IDs, rótulos), use as funções a* para que os pares chave→valor permaneçam juntos. A função asort() ordena por valor em ordem crescente; arsort() faz o mesmo em ordem decrescente.
$ages = ['Peter' => 35, 'John' => 28, 'Mary' => 32];
asort($ages);
print_r($ages);
// Output: Array ( [John] => 28 [Mary] => 32 [Peter] => 35 )Observe que cada nome permanece vinculado à sua idade — essa é a diferença em relação a sort(), que descartaria os nomes.
Ordenando Arrays Associativos por Chave
A função ksort() ordena por chave em ordem crescente, mantendo cada chave vinculada ao seu valor; krsort() ordena por chave em ordem decrescente.
$colors = ['red' => '#FF0000', 'blue' => '#0000FF', 'green' => '#008000'];
ksort($colors);
print_r($colors);
// Output: Array ( [blue] => #0000FF [green] => #008000 [red] => #FF0000 )Ordenação em Ordem Natural
Uma ordenação de string comum compara caractere por caractere, então 'img10' é ordenado antes de 'img2' (porque '1' < '2'). A função natsort() usa um algoritmo de "ordem natural" que compara números incorporados como números — da forma como um humano ordenaria nomes de arquivos. Ela preserva as chaves.
$files = ['img12.png', 'img10.png', 'img2.png', 'img1.png'];
natsort($files);
print_r($files);
// Output: Array ( [3] => img1.png [2] => img2.png [1] => img10.png [0] => img12.png )Use natcasesort() para o mesmo comportamento, ignorando maiúsculas/minúsculas.
Ordenação Personalizada com usort()
Quando as ordens integradas não são suficientes — para ordenar objetos, arrays multidimensionais ou por um valor derivado — usort() permite que você forneça sua própria função de comparação. O callback recebe dois elementos e deve retornar um número negativo, 0 ou um número positivo dependendo se o primeiro deve vir antes, igual ou após o segundo.
$people = [
['name' => 'Mary', 'age' => 32],
['name' => 'Peter', 'age' => 35],
['name' => 'John', 'age' => 28],
];
usort($people, function ($a, $b) {
return $a['age'] <=> $b['age']; // spaceship operator: ascending by age
});
foreach ($people as $person) {
echo $person['name'] . ': ' . $person['age'] . "\n";
}
// Output:
// John: 28
// Mary: 32
// Peter: 35O operador "nave espacial" <=> retorna exatamente os valores -1 / 0 / 1 que o callback precisa, o que o torna a escolha idiomática aqui. Se você precisar manter as chaves, use uasort(); para ordenar por uma regra de chave personalizada, use uksort().
Escolhendo a Função Certa
- Lista simples, sem preocupação com chaves →
sort()/rsort(). - Array associativo, ordenar por valor, manter chaves →
asort()/arsort(). - Array associativo, ordenar por chave →
ksort()/krsort(). - Nomes de arquivos ou strings semelhantes a versões →
natsort()/natcasesort(). - Objetos, arrays aninhados ou qualquer regra personalizada →
usort()/uasort()/uksort().
Se você só precisa inverter a ordem existente sem reordenar, array_reverse() é mais eficiente do que uma ordenação completa. Para ordenar vários arrays juntos ou por várias colunas, consulte array_multisort().
Conclusão
O PHP oferece um conjunto completo de ferramentas para ordenar arrays, e a escolha certa resume-se a duas perguntas: você está ordenando por valor ou por chave, e precisa manter as chaves associadas? sort() e rsort() lidam com listas simples, as famílias a*/k* lidam com dados associativos, natsort() lida com ordenação amigável para humanos, e a família u* lida com qualquer coisa personalizada. Lembre-se de que todas essas funções ordenam no lugar e retornam um boolean — não um novo array.