W3docs

Array Multisort in PHP: Guida Completa

PHP offre molte funzioni per gli sviluppatori web. Scopri come array_multisort() ordina array paralleli e più colonne contemporaneamente.

array_multisort() ordina uno o più array contemporaneamente. La sua vera potenza risiede nell'ordinamento di array paralleli — più array che rappresentano colonne dello stesso dataset — in modo che quando si riordina uno, gli altri si spostino in sincronia per mantenere le righe corrispondenti allineate. Questa pagina illustra la sintassi, gli ordinamenti multi-colonna (con gestione dei pareggi), il problema della reindicizzazione delle chiavi e le differenze rispetto a sort() e usort().

Sintassi

array_multisort(
    array &$array1,
    mixed $array1_sort_order = SORT_ASC,
    mixed $array1_sort_flags  = SORT_REGULAR,
    mixed ...$rest
): bool

Gli argomenti vengono letti in gruppi: ogni array può essere seguito da una costante opzionale per l'ordine di ordinamento e da una costante opzionale per i flag di ordinamento. La funzione ordina in place (gli array vengono passati per riferimento) e restituisce true in caso di successo, false in caso di errore.

CostanteEffetto
SORT_ASCOrdina in modo crescente (predefinito)
SORT_DESCOrdina in modo decrescente
SORT_REGULARConfronta gli elementi normalmente (predefinito)
SORT_NUMERICConfronta gli elementi come numeri
SORT_STRINGConfronta gli elementi come stringhe

Ordinamento di un singolo array

Nella sua forma più semplice si comporta come sort() — ordina un array in place:

$data = [3, 1, 2];
array_multisort($data);
print_r($data);

Output:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

Ordinamento di array paralleli (il caso d'uso principale)

Supponiamo di avere due array allineati per indice — uno di età, uno di nomi — e di voler ordinare per età mantenendo ogni nome associato alla propria età. Si passano entrambi gli array; il primo array determina l'ordine e ogni altro array viene riorganizzato allo stesso modo:

$ages  = [25, 25, 30];
$names = ['John', 'Jane', 'Alice'];

array_multisort($ages, SORT_ASC, $names, SORT_ASC);

print_r($ages);
print_r($names);

Output:

Array
(
    [0] => 25
    [1] => 25
    [2] => 30
)
Array
(
    [0] => Jane
    [1] => John
    [2] => Alice
)

Nota la gestione del pareggio: entrambi i 25enni mantengono le loro posizioni, ma poiché è stato fornito un secondo array ($names, SORT_ASC), le righe con età uguali vengono ordinate per nome — Jane prima di John.

Ordinamento per più criteri

Per gestire i pareggi, elenca gli array in ordine di priorità: il primo array è la chiave di ordinamento primaria, il successivo rompe i pareggi nel primo, e così via. Ogni array ha il proprio flag d'ordine, quindi è possibile combinare colonne crescenti e decrescenti:

$volume  = [67, 86, 85, 98, 86, 67];
$edition = [2, 1, 6, 2, 6, 7];

// Sort by volume DESC, then by edition ASC for equal volumes.
array_multisort($volume, SORT_DESC, $edition, SORT_ASC);

print_r($volume);
print_r($edition);

Output:

Array
(
    [0] => 98
    [1] => 86
    [2] => 86
    [3] => 85
    [4] => 67
    [5] => 67
)
Array
(
    [0] => 2
    [1] => 1
    [2] => 6
    [3] => 6
    [4] => 2
    [5] => 7
)

I due 86 e i due 67 vengono mantenuti raggruppati, e all'interno di ogni pareggio le edizioni sono in ordine crescente.

Ordinamento di un array di righe per colonna

I dataset reali sono spesso un array di righe associative. Usa array_column() per estrarre le colonne per cui vuoi ordinare, poi passa l'array originale come ultimo argomento in modo che venga riordinato di conseguenza:

$rows = [
    ['name' => 'Bob',   'age' => 30],
    ['name' => 'Alice', 'age' => 25],
    ['name' => 'Carol', 'age' => 30],
];

$age  = array_column($rows, 'age');
$name = array_column($rows, 'name');

// Primary: age ASC. Tie-break: name ASC.
array_multisort($age, SORT_ASC, $name, SORT_ASC, $rows);

print_r($rows);

Output:

Array
(
    [0] => Array ( [name] => Alice [age] => 25 )
    [1] => Array ( [name] => Bob   [age] => 30 )
    [2] => Array ( [name] => Carol [age] => 30 )
)

Attenzione: le chiavi vengono reindicizzate

array_multisort() reindicizza le chiavi numeriche (diventano 0, 1, 2, …), ma le chiavi stringa vengono preservate. Se è necessario mantenere le chiavi intere originali, ordina una copia delle chiavi insieme ai dati, oppure usa una funzione che preserva le chiavi come asort().

Quando usare quale funzione di ordinamento

  • Usa array_multisort() quando hai array paralleli o hai bisogno di un ordinamento multi-colonna.
  • Usa sort() / rsort() per un singolo array per valore quando le chiavi non hanno importanza.
  • Usa ksort() / asort() per ordinare per chiave, o per valore preservando le chiavi.
  • Usa usort() quando un array necessita di una logica di confronto personalizzata (ad esempio, ordinare per lunghezza di stringa o per un valore derivato) che i flag non possono esprimere.

Consulta la panoramica Ordinamento degli Array per un confronto affiancato di tutte le funzioni di ordinamento.

graph LR
A[Array] --> B[Array Multisort]
B --> C[Ascending/Descending Order]
B --> D[Sorting by Key]
B --> E[Sorting by Multiple Criteria]

Pratica

Pratica
Cosa fa la funzione array_multisort() in PHP?
Cosa fa la funzione array_multisort() in PHP?
Was this page helpful?