Se un array ha al suo interno una serie di altri array, tutti uguali, con gli stessi sottoelementi e si vuole ordinare questo primo array secondo ordine degli elementi del sottoarray viene comoda la funzione array_multisort
che permette di ordinare un array secondo l'ordine di un secondo array.
In pratica:
<?php$list = ['one' => ['positive' => 3,'negative' => 2],'two' => ['positive' => 1,'negative' => 0],'three' => ['positive' => 5,'negative' => 0],'four' => ['positive' => 4,'negative' => 5],'five' => ['positive' => 6,'negative' => 2],];foreach ($list as $key => $value) {$list[$key]['score'] = $value['positive'] - $value['negative'];}foreach ($list as $key => $value) {$score[$key] = $value['score'];$positive[$key] = $value['positive'];$negative[$key] = $value['negative'];}array_multisort($score, SORT_DESC,$positive, SORT_DESC,$negative, SORT_ASC,$list);echo '<pre>'.print_r($list, 1).'</pre>';
Partendo dalla lista faccio un primo ciclo per trovare lo score
che è la differenza tra positive - negative
. È il parametro per cui voglio ordinare in prima istanza: per chi ha più score
, poi voglio ordinare per chi ha più positive
e infine per chi ha meno negative
.
Faccio quindi un secondo ciclo per avere una lista di ogni punteggio: $score
; $positive
; $negative
. Questi nuovi array, dotati delle stesse chiavi di $list
saranno i parametri di ordinamento di $list
stesso attraverso la funzione array_multisort
che prende poi come ultimo parametro l'array da ordinare secondo quei parametri.