W3docs

usort()

Scopri come usort() di PHP ordina un array con una callback di confronto personalizzata, con esempi su stringhe, numeri e oggetti.

La funzione usort() di PHP ordina un array usando una funzione di confronto che tu scrivi. Mentre le funzioni integrate come sort() sanno ordinare i valori in un solo modo (crescente, per valore), usort() ti permette di esprimere qualsiasi regola — ordinare oggetti per una proprietà, numeri in un ordine personalizzato, o stringhe con una regola di spareggio. Questa pagina spiega come funziona la callback di confronto, mostra esempi con stringhe, numeri e oggetti, e descrive le insidie più comuni.

Cos'è la funzione usort()?

La funzione usort() è una funzione integrata di PHP che ordina un array usando una regola di confronto personalizzata. A differenza delle funzioni di ordinamento standard che ordinano per valore o chiave in ordine crescente/decrescente, usort() richiede una callback che definisca la logica di confronto. Modifica l'array originale sul posto e restituisce true in caso di successo o false in caso di errore (quindi ordini l'array, non catturi il valore restituito come risultato ordinato).

Come funziona la callback di confronto

La callback riceve due elementi, $a e $b, e deve restituire un intero che indica a usort() il loro ordine relativo:

  • un numero negativo se $a deve venire prima di $b,
  • un numero positivo se $a deve venire dopo $b,
  • 0 se sono considerati uguali.

Da PHP 7 l'operatore spaceship <=> fa esattamente questo in un solo passaggio: $a <=> $b restituisce -1, 0, o 1. La maggior parte delle callback di confronto si riduce a un singolo return che lo utilizza.

Nota: usort() non è un ordinamento stabile. Se due elementi sono considerati uguali, il loro ordine relativo originale non è garantito. A partire da PHP 8.0 l'ordinamento è stabile, ma le versioni precedenti non lo sono. Inoltre, usort() reindizza l'array sequenzialmente a partire da 0, quindi le chiavi originali vengono perse — usa uasort() se hai bisogno di mantenere le associazioni tra chiavi e valori.

Sintassi

La sintassi della funzione usort() è la seguente:

La sintassi della funzione usort() in PHP

usort($array, $callback);

Qui, $array è l'array che vuoi ordinare e $callback è la funzione callback che definisce le regole di ordinamento personalizzate.

Parametri e valore restituito

ParametroTipoDescrizione
$arrayarrayL'array da ordinare.
$callbackcallableUna funzione di confronto definita dall'utente.

Valore restituito: Restituisce true in caso di successo o false in caso di errore.

Esempio d'uso

Vediamo un esempio per capire come funziona la funzione usort(). Supponiamo di avere un array di nomi che vogliamo ordinare in ordine alfabetico, ma con una regola personalizzata: tutti i nomi che iniziano con "J" devono venire prima.

Come usare la funzione usort() in PHP?

php— editable, runs on the server

In questo esempio definiamo una funzione callback che confronta due nomi e restituisce -1, 0 o 1 in base alle regole di ordinamento personalizzate. Se la prima lettera di $a è "J" e la prima lettera di $b non è "J", allora $a viene prima di $b. Se la prima lettera di $a non è "J" e la prima lettera di $b è "J", allora $b viene prima di $a. Se entrambi i nomi iniziano con "J" o nessuno dei due inizia con "J", usiamo il moderno operatore spaceship di PHP (<=>) per confrontare i nomi alfabeticamente.

Dopo l'esecuzione di questo codice, l'array $names sarà ordinato come segue:

Array
(
    [0] => Jack
    [1] => Jenny
    [2] => John
    [3] => Adam
    [4] => Bob
)

Ordinare oggetti o array per un campo

L'uso più comune di usort() nel mondo reale è ordinare un elenco di record (array associativi o oggetti) per uno dei loro campi — qualcosa che sort() non può fare. Qui ordiniamo un elenco di prodotti per prezzo, in modo crescente:

<?php

$products = [
    ["name" => "Book",   "price" => 15],
    ["name" => "Pen",    "price" => 2],
    ["name" => "Laptop", "price" => 900],
];

usort($products, fn ($a, $b) => $a["price"] <=> $b["price"]);

print_r(array_column($products, "name"));

L'intero confronto è una singola espressione spaceship. L'output, dal meno costoso al più costoso:

Array
(
    [0] => Pen
    [1] => Book
    [2] => Laptop
)

Per ordinare in modo decrescente, basta invertire gli operandi: $b["price"] <=> $a["price"].

Insidie comuni

  • Uso errato del valore restituito. usort() restituisce true/false, non l'array ordinato. Scrivere $sorted = usort($arr, ...)true, non i tuoi dati. L'array viene ordinato sul posto.
  • Le chiavi vengono azzerate. Le chiavi originali vengono scartate e sostituite con 0, 1, 2, …. Usa uasort() per preservare le chiavi, o uksort() per ordinare per chiavi.
  • Restituire un bool dalla callback. Restituire $a > $b (un boolean) funziona per l'ordine crescente per caso, ma si rompe per l'ordine decrescente e i casi di uguaglianza. Restituisci sempre un intero — preferisci <=>.

Funzioni correlate

  • sort() — ordina un array per valore, in modo crescente, senza callback.
  • asort() — ordina per valore preservando le chiavi.
  • ksort() — ordina per chiave.
  • uasort() — come usort() ma preserva le associazioni tra chiavi e valori.
  • uksort() — ordina per chiavi usando una callback personalizzata.

Conclusione

In questo articolo abbiamo discusso la funzione usort() in PHP e dimostrato come può essere utilizzata per ordinare array con regole di ordinamento personalizzate. Definendo una funzione callback, puoi ordinare gli array nell'ordine che preferisci, in base alle tue regole personalizzate. Questa funzione può essere particolarmente utile nelle situazioni in cui le funzioni di ordinamento integrate in PHP non sono sufficienti per le tue esigenze. Con la funzione usort() hai il pieno controllo su come vengono ordinati i tuoi array.

Pratica

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