Пример массива, который нужно отсортировать:
$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'));