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
): boolGli 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.
| Costante | Effetto |
|---|---|
SORT_ASC | Ordina in modo crescente (predefinito) |
SORT_DESC | Ordina in modo decrescente |
SORT_REGULAR | Confronta gli elementi normalmente (predefinito) |
SORT_NUMERIC | Confronta gli elementi come numeri |
SORT_STRING | Confronta 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]