Ordinare un array multidimensionale per le chiavi del sottoarray

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.