PHP 7+
A partire da PHP 7, questo può essere fatto in modo conciso utilizzando usort
una funzione anonima che utilizza l' operatore di astronave per confrontare gli elementi.
Puoi fare un ordinamento crescente come questo:
usort($inventory, function ($item1, $item2) {
return $item1['price'] <=> $item2['price'];
});
O un ordinamento discendente come questo:
usort($inventory, function ($item1, $item2) {
return $item2['price'] <=> $item1['price'];
});
Per capire come funziona, nota che usort
accetta una funzione di confronto fornita dall'utente che deve comportarsi come segue (dai documenti):
La funzione di confronto deve restituire un numero intero minore, uguale o maggiore di zero se il primo argomento è considerato rispettivamente minore di, uguale a o maggiore del secondo.
E nota anche che <=>
, l'operatore dell'astronave,
restituisce 0 se entrambi gli operandi sono uguali, 1 se la sinistra è maggiore e -1 se la destra è maggiore
che è esattamente ciò di cui ha usort
bisogno. In effetti, quasi l'intera giustificazione fornita per l'aggiunta <=>
alla lingua in https://wiki.php.net/rfc/combined-comparison-operator è che
usort()
semplifica la scrittura di ordini callback da utilizzare con
PHP 5.3+
PHP 5.3 ha introdotto funzioni anonime, ma non ha ancora l'operatore di astronave. Possiamo ancora usare usort
per ordinare il nostro array, ma è un po 'più dettagliato e difficile da capire:
usort($inventory, function ($item1, $item2) {
if ($item1['price'] == $item2['price']) return 0;
return $item1['price'] < $item2['price'] ? -1 : 1;
});
Si noti che sebbene sia abbastanza comune per i comparatori che si occupano di valori interi restituire semplicemente la differenza dei valori, come $item2['price'] - $item1['price']
, in questo caso non possiamo farlo in modo sicuro. Questo perché i prezzi sono numeri in virgola mobile nell'esempio di chi chiede la domanda, ma la funzione di confronto a cui passiamo usort
deve restituire numeri interi per usort
funzionare correttamente:
La restituzione di valori non interi dalla funzione di confronto, come float, comporterà un cast interno a un numero intero del valore restituito del callback. Quindi valori come 0,99 e 0,1 verranno entrambi espressi su un valore intero pari a 0, che confronterà tali valori come uguali.
Questa è una trappola importante da tenere a mente quando si usa usort
in PHP 5.x! La mia versione originale di questa risposta ha fatto questo errore eppure ho accumulato dieci voti su migliaia di visualizzazioni apparentemente senza che nessuno si accorgesse del grave bug. La facilità con cui i deficienti come me possono rovinare le funzioni del comparatore è precisamente la ragione per cui l'operatore di astronave più facile da usare è stato aggiunto al linguaggio in PHP 7.