Сортировка
многомерного массива по значениям
Частенько требуется отсортировать многомерный массив по его значениям. Следующую функцию я давно нарыл в интеренете и немного переписал под свои нужды ( чтобы можно было встроить в любой класс ).
Таким образом можно обрабатывать данные приходящие к нам из любой базы данных. Пример можно просто скопировать и пообновлять страницу, все работает!
Функция сортирует по имени, группируя сходные значения, если необходимо сортировать по величине числа, достаточно немного переписать 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 );