Сортировка массива по нескольким значениям в PHP | Паршин Павел

Пример массива, который нужно отсортировать:

$example = array (
    '0' => array (
        'points' => '6',
        'matches'  => '2',
    ),
    '1' => array (
        'points' => '3',
        'matches'  => '2',
    ),
    '2' => array (
        'points' => '1',
        'matches'  => '2',
    ),
    '3' => array (
        'points' => '1',
        'matches'  => '1',
    ),
);

Массив сортируем сначала по параметру 'points', затем - по 'matches'. Для этого используем функцию usort. Её синтаксис прост:

usort($example, 'my_sort_function');

где $example - входной массив; my_sort_function - функция сравнения, которую мы предоставляем сами.

Замечание: Эта функция присваивает новые ключи элементам массива. Она удалит все существующие ключи, а не просто переупорядочит их.

Функция сортировки будет выглядеть так:

function my_sort_function($a, $b) {
    if ($a['points'] > $b['points']) { return -1; }

    if ($a['points'] < $b['points']) { return 1; }

    if ($a['points'] == $b['points']) {
        if ($a['matches'] == $b['matches']) return 0;
        return ($a['matches'] > $b['matches']) ? 1 : -1;
    }
}

Собственно всё! Как нетрудно догадаться, этот метод можно использовать и для сортировки массива по 3 и более параметрам.

Теперь рассмотрим случай, если в функцию сравнения нужно передать какую-нибудь внешнюю переменную, например, $cid.

Для этого переопределяем callback-функцию, объявляя свой класс:

class sortTableClass {
    private $cid;

    function __construct( $cid ) {
        $this->cid = $cid;
    }

    function call( $a, $b ) {
        return my_sort_function($a, $b, $this->cid);
    }
}

usort($example, array(new sortTableClass($cid), 'call'));

Предыдущая запись Следующая запись