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

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

$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'));

Теги: