uksort()
Impara PHP uksort(): ordina un array per chiavi con una funzione di confronto personalizzata. Sintassi, valore restituito e differenze rispetto a ksort() e usort().
Introduzione
uksort() ordina un array per chiavi usando una funzione di confronto che scrivi tu stesso. A differenza di ksort(), che ordina le chiavi solo in modo ascendente naturale, uksort() ti permette di decidere l'ordine — alfabetico, inverso, per lunghezza della stringa, in base a una lista di priorità personalizzata, o qualsiasi regola esprimibile in codice. L'associazione chiave-valore è sempre preservata.
Questa pagina illustra la sintassi e il valore restituito, come funziona la callback di confronto, diversi esempi eseguibili (incluso l'operatore spaceship), le insidie comuni e le differenze tra uksort() e le funzioni di ordinamento correlate.
Sintassi
uksort(array &$array, callable $callback): true$array— l'array da ordinare. Viene passato per riferimento e ordinato in-place, quindi la variabile originale viene modificata direttamente.$callback— una funzione di confronto che riceve due chiavi ($ae$b) e restituisce un intero:- un numero negativo se
$adeve venire prima di$b, 0se sono considerate uguali,- un numero positivo se
$adeve venire dopo$b.
- un numero negativo se
La funzione restituisce true (in PHP 8+; in precedenza restituiva un bool). Poiché l'ordinamento avviene per riferimento, si legge il risultato dalla variabile array originale — non dal valore restituito.
La callback confronta le chiavi, non i valori. Questa è la differenza fondamentale tra
uksort()eusort()(che confronta i valori) euasort()(che confronta i valori ma mantiene l'associazione delle chiavi).
Esempio di base: ordinare le chiavi alfabeticamente
Supponiamo di avere un array di frutti con chiave per nome e di volerli in ordine alfabetico per chiave:
<?php
$fruits = [
"orange" => 3,
"apple" => 2,
"banana" => 1,
];
function cmp($a, $b)
{
return strcmp($a, $b);
}
uksort($fruits, "cmp");
print_r($fruits);strcmp() restituisce già un intero negativo, zero o positivo, quindi si adatta perfettamente alla callback. L'output è ordinato per chiave:
Array
(
[apple] => 2
[banana] => 1
[orange] => 3
)Usare l'operatore spaceship
Da PHP 7, l'operatore spaceship <=> restituisce -1, 0 o 1 per minore di, uguale o maggiore di — esattamente il formato atteso da uksort(). Con una arrow function la callback diventa una singola riga:
<?php
$data = ["delta" => 1, "alpha" => 2, "charlie" => 3, "bravo" => 4];
uksort($data, fn($a, $b) => $a <=> $b);
print_r($data);Questo ordina le chiavi in modo ascendente:
Array
(
[alpha] => 2
[bravo] => 4
[charlie] => 3
[delta] => 1
)Per invertire l'ordine, scambia gli operandi: fn($a, $b) => $b <=> $a.
Un ordinamento personalizzato
La vera potenza di uksort() è l'ordinamento secondo una regola che nessuna funzione built-in fornisce — ad esempio, per lunghezza della chiave, poi alfabeticamente in caso di parità:
<?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);L'operatore ?: in short-circuit restituisce il confronto per lunghezza a meno che non sia 0, nel qual caso ricade nel confronto alfabetico:
Array
(
[x] => 0
[id] => 1
[name] => Ann
[is_active] => 1
)Insidie comuni
- Restituisce
true, non l'array ordinato. Scrivere$sorted = uksort($arr, ...)ti dàtrue. Usa$arrin seguito. - L'array originale viene modificato. Copialo prima (
$copy = $arr;) se hai bisogno di mantenere l'ordine originale. - La callback deve essere coerente. Restituire valori casuali (es.
rand(-1, 1)) produce risultati non definiti. Per mescolare, usashuffle()sui valori oarray_rand()sulle chiavi. - Restituisci un intero. Restituire un
boolfunziona per coercizione ma è fragile —falsediventa0(uguale), quindireturn $a < $b;è un bug. Usa<=>ostrcmp().
Come uksort() si confronta con le funzioni correlate
| Funzione | Ordina per | Callback personalizzata | Mantiene l'associazione delle chiavi |
|---|---|---|---|
uksort() | chiavi | sì | sì |
ksort() | chiavi | no (ordine naturale) | sì |
usort() | valori | sì | no (reindicizzato) |
uasort() | valori | sì | sì |
asort() | valori | no | sì |
In sintesi: scegli uksort() ogni volta che hai bisogno di ordinare un array associativo per chiavi con una regola che ksort() non può esprimere. Per approfondire l'argomento, consulta Ordinare Array in PHP.
Conclusione
uksort() ordina un array associativo per chiavi usando una callback di confronto che controlli tu, modificando l'array in-place e preservando i legami chiave-valore. Con l'operatore spaceship la callback è concisa, e la logica personalizzata permette di implementare ordinamenti che nessuna funzione built-in offre.
Diagramma
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];