uksort()
Aprenda o PHP uksort(): ordene um array pelas chaves usando uma função de comparação definida pelo usuário. Cobre sintaxe, valor de retorno e diferenças em relação a ksort() e usort().
Introdução
uksort() ordena um array pelas suas chaves usando uma função de comparação que você mesmo escreve. Ao contrário de ksort(), que ordena as chaves apenas em ordem crescente natural, uksort() permite que você defina a ordem — alfabética, inversa, por comprimento de string, por uma lista de prioridade personalizada, ou qualquer regra que você consiga expressar em código. A associação chave-valor é sempre preservada.
Esta página abrange a sintaxe e o valor de retorno, como a função de comparação (callback) funciona, vários exemplos executáveis (incluindo o operador spaceship), armadilhas comuns e como uksort() difere de funções de ordenação relacionadas.
Sintaxe
uksort(array &$array, callable $callback): true$array— o array a ser ordenado. É passado por referência e ordenado in place, portanto a variável original é modificada diretamente.$callback— uma função de comparação que recebe duas chaves ($ae$b) e retorna um inteiro:- um número negativo se
$adeve vir antes de$b, 0se forem consideradas iguais,- um número positivo se
$adeve vir depois de$b.
- um número negativo se
A função retorna true (no PHP 8+; anteriormente retornava um bool). Como a ordenação ocorre por referência, você lê o resultado a partir da variável do array original — não pelo valor de retorno.
O callback compara chaves, não valores. Esse é o fato que distingue
uksort()deusort()(que compara valores) euasort()(que compara valores mas mantém a associação de chaves).
Exemplo básico: ordenar chaves alfabeticamente
Suponha que temos um array de frutas com chaves por nome e queremos que fiquem em ordem alfabética pela chave:
<?php
$fruits = [
"orange" => 3,
"apple" => 2,
"banana" => 1,
];
function cmp($a, $b)
{
return strcmp($a, $b);
}
uksort($fruits, "cmp");
print_r($fruits);strcmp() já retorna um inteiro negativo, zero ou positivo, portanto se encaixa diretamente no callback. A saída é ordenada pela chave:
Array
(
[apple] => 2
[banana] => 1
[orange] => 3
)Usando o operador spaceship
Desde o PHP 7, o operador spaceship <=> retorna -1, 0 ou 1 para menor, igual ou maior — exatamente o que uksort() espera. Com uma arrow function, o callback se torna uma linha única:
<?php
$data = ["delta" => 1, "alpha" => 2, "charlie" => 3, "bravo" => 4];
uksort($data, fn($a, $b) => $a <=> $b);
print_r($data);Isso ordena as chaves de forma crescente:
Array
(
[alpha] => 2
[bravo] => 4
[charlie] => 3
[delta] => 1
)Para inverter a ordem, troque os operandos: fn($a, $b) => $b <=> $a.
Uma ordenação personalizada
O verdadeiro poder do uksort() está em ordenar por uma regra que nenhuma função interna oferece — por exemplo, por comprimento de chave, e depois alfabeticamente em caso de empate:
<?php
$config = [
"id" => 1,
"name" => "Ann",
"is_active" => true,
"x" => 0,
];
uksort($config, function ($a, $b) {
return strlen($a) <=> strlen($b) // shortest keys first
?: strcmp($a, $b); // ties broken alphabetically
});
print_r($config);O ?: de curto-circuito retorna a comparação por comprimento, a menos que seja 0, caso em que recorre à comparação alfabética:
Array
(
[x] => 0
[id] => 1
[name] => Ann
[is_active] => 1
)Armadilhas comuns
- Retorna
true, não o array ordenado. Escrever$sorted = uksort($arr, ...)lhe dátrue. Use$arrdepois em vez disso. - O array original é mutado. Copie-o primeiro (
$copy = $arr;) se precisar manter a ordem original. - O callback deve ser consistente. Retornar valores aleatórios (por exemplo,
rand(-1, 1)) gera resultados indefinidos. Para embaralhar, useshuffle()nos valores ouarray_rand()nas chaves. - Retorne um inteiro. Retornar um
boolfunciona por coerção, mas é frágil —falsevira0(igual), portantoreturn $a < $b;é um bug. Use<=>oustrcmp().
Como uksort() se compara a funções relacionadas
| Função | Ordena por | Callback personalizado | Mantém associação de chaves |
|---|---|---|---|
uksort() | chaves | sim | sim |
ksort() | chaves | não (ordem natural) | sim |
usort() | valores | sim | não (reindexado) |
uasort() | valores | sim | sim |
asort() | valores | não | sim |
Em resumo: use uksort() sempre que precisar ordenar um array associativo pelas suas chaves com uma regra que ksort() não consegue expressar. Para mais informações sobre o tema, veja Ordenando Arrays em PHP.
Conclusão
uksort() ordena um array associativo pelas suas chaves usando um callback de comparação que você controla, modificando o array in place e preservando os vínculos chave-valor. Com o operador spaceship o callback é conciso, e a lógica personalizada permite implementar ordenações que nenhuma função interna oferece.
Diagrama
graph LR
A[Array] --> B(Function);
B --> C[Comparison result];
C --> D{Is result negative?};
D -->|Yes| E[Swap];
C -->|No| F[Do not swap];
F --> G[Next comparison];
E --> G[Next comparison];