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.

Last updated