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

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

Частенько требуется отсортировать многомерный массив по его значениям. Следующую функцию я давно нарыл в интеренете и немного переписал под свои нужды ( чтобы можно было встроить в любой класс ).

Таким образом можно обрабатывать данные приходящие к нам из любой базы данных. Пример можно просто скопировать и пообновлять страницу, все работает!

Функция сортирует по имени, группируя сходные значения, если необходимо сортировать по величине числа, достаточно немного переписать array_sort_func().

<?php
class func {
     public function array_sort_func( $a, $b=NULL ) {
     static $keys;
          if( $b === NULL ) return $keys = $a;
          foreach( $keys as $k ) {
               if( @$k[0] == '!') { // @ - ставим что бы не вылезали ошибки в хедере ( а могут быть )
                    $k = substr( $k,1 );
                    if( @$a[$k] !== @$b[$k] ) {
                         return strcmp( @$b[$k], @$a[$k] );
                    }
               }
               else if ( @$a[$k] !== @$b[$k] ) {
                    return strcmp( @$a[$k], @$b[$k] );
               }
          }
     return 0;
     }

     public function array_sort( &$array ) { // & - значит что мы сразу же изменяем активный массив
          if( !$array ) return $keys;
          $keys = func_get_args(); // получаем массив сортировки - тоесть полей сортировки может быть несколько
          array_shift( $keys );
          $this->array_sort_func( $keys );
          usort( $array, array( $this, 'array_sort_func' ) );
          return $array;
     }
}

$sort = new func;

// быстро создадим массив для тестов
$groups = array( 'ololo', 'brushes', 'bread', 'product' );
$array = array();
for( $x = 0; $x < 10; $x++ ) {
    $array[] = array(
        'id' => rand( 1,9 ),
        'group' => $groups[array_rand( $groups, 1 )],
        'group2' => $groups[array_rand( $groups, 1 )]
    );
}

/* тестируем функцию */
$sort->array_sort( $array, 'group' ); // по алфавиту

echo '<pre>';
print_r( $array );
echo '<hr />';

$sort->array_sort( $array, '!group', 'group2' ); // первый параметр алфавит наоборот и второй по алфавиту

echo '<pre>';
print_r( $array );

07 марта 2012, 12:28
PHP


Авторизация
Зайди на сайт с помощью соц. сети: