W3docs

uasort()

Scopri come ordinare array associativi PHP per valore con una funzione di confronto personalizzata usando uasort(), mantenendo le chiavi originali.

Ordinare array in PHP con uasort()

La funzione PHP uasort() ordina un array associativo per i suoi valori usando una funzione di confronto che scrivi tu stesso, mantenendo ogni valore associato alla propria chiave originale. La "u" sta per user-defined (fornisci tu la logica di confronto) e la "a" sta per associative (le coppie chiave/valore vengono preservate).

Questa pagina spiega cosa fa uasort(), la sua sintassi, come scrivere una corretta funzione di confronto ed esempi pratici per array semplici, associativi e multidimensionali — ogni risultato mostrato è l'output reale dell'esecuzione del codice.

Cosa fa uasort() e quando usarla

La maggior parte delle funzioni di ordinamento di PHP ignora le chiavi o permette solo l'ordinamento con le regole di confronto predefinite. uasort() ti offre entrambe le cose contemporaneamente:

  • Controlli l'ordine. Passi una callback che decide quale di due valori viene prima, così puoi ordinare per lunghezza, per un campo nidificato, in ordine inverso, per una lista di priorità personalizzata — qualsiasi cosa tu possa esprimere in codice.
  • Le chiavi rimangono associate ai loro valori. Dopo l'ordinamento, $array["John"] punta ancora al valore di John; cambia solo l'ordine in cui le coppie vengono iterate.

Usa uasort() quando entrambe queste condizioni sono vere: hai bisogno di una regola personalizzata e le chiavi sono significative (un nome, un ID, uno slug). Se le chiavi sono semplici posizioni 0, 1, 2… usa usort(), che reindicizza automaticamente. Se vuoi ordinare per chiavi invece che per valori, usa uksort(). Se hai bisogno solo di un semplice ordinamento crescente/decrescente per valori senza regole personalizzate, asort() e arsort() lo fanno senza callback.

Sintassi

uasort(array &$array, callable $callback): bool
  • array &$array — l'array da ordinare. Il simbolo & significa che viene passato per riferimento: uasort() ordina l'array in loco e restituisce true/false, non restituisce un nuovo array ordinato.
  • callable $callback — la tua funzione di confronto. Riceve due valori, $a e $b, e deve restituire un intero che indica a PHP il loro ordine relativo.
  • Valore di ritorno — bool, sempre true (restituisce un valore per poter essere usata in espressioni, ma normalmente viene chiamata per il suo effetto collaterale su $array).

Poiché l'array viene modificato in loco, scrivi uasort($array, ...); su una riga a sé — non scrivere $array = uasort($array, ...), che sovrascriverà i tuoi dati con true.

Scrivere la funzione di confronto

La callback confronta due valori e restituisce un intero:

  • un numero negativo se $a deve venire prima di $b,
  • 0 se il loro ordine non ha importanza (sono considerati uguali),
  • un numero positivo se $a deve venire dopo $b.

Il modo più pulito per produrre questo risultato è l'operatore spaceship <=>, che restituisce esattamente -1, 0 o 1:

// ascending
fn($a, $b) => $a <=> $b;

// descending — just flip the operands
fn($a, $b) => $b <=> $a;

Lo stile più vecchio ($a < $b) ? -1 : 1 funziona anch'esso, ma non restituisce mai 0, quindi gli elementi uguali ottengono un ordine arbitrario. Preferisci <=>; è più breve, corretto per il caso di uguaglianza e funziona per numeri, stringhe e array.

Esempio 1: Ordinare i valori di un array indicizzato (chiavi preservate)

Qui uasort() ordina i numeri in modo crescente, ma nota come le chiavi originali viaggiano con i valori — questa è la differenza rispetto a sort(), che li rinumererebbe 0…9.

php— editable, runs on the server

Output:

Array
(
    [1] => 1
    [3] => 1
    [6] => 2
    [0] => 3
    [9] => 3
    [2] => 4
    [4] => 5
    [8] => 5
    [7] => 6
    [5] => 9
)

Esempio 2: Ordinare un array associativo per valore

Questo è l'uso più comune: ordinare le persone per età mantenendo i loro nomi come chiavi.

php— editable, runs on the server

Output:

Array
(
    [Mary] => 28
    [Jane] => 28
    [John] => 32
    [David] => 37
    [Bob] => 45
)

Per ordinare dal più vecchio al più giovane, inverti gli operandi: fn($a, $b) => $b <=> $a.

Esempio 3: Ordinare un array multidimensionale per un campo nidificato

Quando ogni elemento è a sua volta un array, la callback riceve l'intero sotto-array, quindi lo si indicizza per scegliere il campo su cui ordinare. Qui ordiniamo per età ([1]).

php— editable, runs on the server

Output:

Array
(
    [1] => Array
        (
            [0] => Mary
            [1] => 28
        )

    [3] => Array
        (
            [0] => Jane
            [1] => 28
        )

    [0] => Array
        (
            [0] => John
            [1] => 32
        )

    [4] => Array
        (
            [0] => David
            [1] => 37
        )

    [2] => Array
        (
            [0] => Bob
            [1] => 45
        )

)

Per righe con chiavi in un campo associativo, sostituisci $a[1] con qualcosa come $a['age'].

uasort() vs usort()

Le funzioni sono identiche tranne per le chiavi. Esegui gli stessi dati con entrambe:

<?php

$ages = ["John" => 32, "Mary" => 28, "Bob" => 45];

$copy = $ages;
usort($copy, fn($a, $b) => $a <=> $b);
echo "usort (keys lost):\n";
print_r($copy);

uasort($ages, fn($a, $b) => $a <=> $b);
echo "uasort (keys kept):\n";
print_r($ages);

Output:

usort (keys lost):
Array
(
    [0] => 28
    [1] => 32
    [2] => 45
)
uasort (keys kept):
Array
(
    [Mary] => 28
    [John] => 32
    [Bob] => 45
)

Errori comuni

  • Restituisce true, non l'array. Leggi il risultato ordinato dalla variabile che hai passato, non dal valore di ritorno.
  • L'ordinamento non è stabile prima di PHP 8.0. Se due valori sono uguali, il loro ordine relativo era definito dall'implementazione nelle versioni precedenti. Da PHP 8.0 in poi, tutte le funzioni di ordinamento (inclusa uasort()) sono stabili, quindi gli elementi uguali mantengono il loro ordine originale.
  • Gestisci sempre il caso di uguaglianza. Restituire 1 per "non minore di" (invece di 0) può mescolare elementi uguali su PHP vecchio ed è semplicemente scorretto; <=> lo gestisce automaticamente.

Funzioni correlate

  • usort() — stesso ordinamento con regola personalizzata, ma reindicizza le chiavi.
  • uksort() — ordina per chiavi con una callback personalizzata.
  • asort() / arsort() — ordinamento per valore, crescente/decrescente, senza callback.
  • ksort() — ordina per chiavi senza callback.
  • Ordinare array in PHP — panoramica di tutte le funzioni di ordinamento e quando usare ciascuna.

Conclusione

uasort() è lo strumento per ordinare un array associativo per valore con la propria regola di confronto mantenendo le chiavi intatte. Abbinala all'operatore spaceship per callback pulite e corrette, ricorda che ordina in loco e sceglila rispetto a usort() ogni volta che le chiavi hanno un significato.

Pratica

Pratica
Qual è lo scopo della funzione uasort() in PHP?
Qual è lo scopo della funzione uasort() in PHP?
Was this page helpful?