Сортировка массивов

Одномерные массивы

Сортировка по возрастанию значений с сохранением ключей

Скопировано
asort( $arr );
Показать код

Пример:

Скопировано
$arr = [ 'c' => 5, 2, 7 => 1, 'один', 'д' => 'два' ];
asort( $arr );
Показать код

Результат:

Array (
  [д] => два
  [8] => один
  [7] => 1
  [0] => 2
  [c] => 5
)

Сортировка по возрастанию значений без сохранения ключей

Скопировано
sort( $arr );
Показать код

Пример:

Скопировано
$arr = [ 'c' => 5, 2, 7 => 1, 'один', 'д' => 'два' ];
sort( $arr );
Показать код

Результат:

Array (
  [0] => два
  [1] => один
  [2] => 1
  [3] => 2
  [4] => 5
)

 

Сортировка по убыванию значений с сохранением ключей

Скопировано
arsort( $arr );
Показать код

Сортировка по убыванию значений без сохранения ключей

Скопировано
rsort( $arr );
Показать код

Сортировка по ключам по возрастанию

Скопировано
ksort( $arr );
Показать код

Сортировка по ключам по убыванию

Скопировано
krsort( $arr );
Показать код

Сортировка без учета регистра

Предположим у нас есть такой массив

[ 'Б', 'Г', 'А', 'в' ]

Если сортировать его обычным образом через sort или asort, то получим такую последовательность

[ 'А', 'Б', 'Г', 'в' ]

Это потому, что большие буквы идут впереди маленьких в таблице символов. Чтобы отсортировать такой массив без учета регистра, делаем так:

Скопировано
$arr = [ 'Б', 'Г', 'А', 'в' ];
setlocale( LC_COLLATE, 'ru_RU.UTF-8' );
sort( $arr, SORT_LOCALE_STRING | SORT_FLAG_CASE );
Показать код

Сортировка ключей первого массива в соответствии с порядком элементов во втором массиве.

Скопировано
$arr1 = [ 'id' => 1, 'price' => 10, 'name' => 'test', 'quantity' => 5 ];
$arr2 = [ 'id', 'name', 'quantity', 'price' ];
$arr = array_filter( array_merge( array_fill_keys( $arr2, '' ), $arr1 ) );
Показать код

Результат:

Array (
  [id] => 1
  [name] => test
  [quantity] => 5
  [price] => 10
)

array_filter нужен на случай, если в массиве $arr1 элементов окажется меньше, чем в массиве $arr2 - в этом случаем в итоговом массиве будут присутствовать пустые элементы.

Сортировка элементов одного массива в порядке следования элементов в другом массиве

Есть два массива:

Скопировано
$daysOfWeek = [ 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота', 'воскресенье' ];
$days = [ 'пятница', 'вторник', 'среда' ];
Показать код

Необходимо элементы второго массива расположить в порядке следования элементов в первом массиве. То есть по порядку дней недели в нашем случае.

Скопировано
$daysOrdered = [];
foreach( $days as $k => $v ) {
$key = array_search( $v, $daysOfWeek );
if( $key !== false ) {
$daysOrdered[$key] = $v;
}
}
ksort( $daysOrdered );
Показать код

Результат:

Array (
  [1] => вторник
  [2] => среда
  [4] => пятница
)

Многомерные массивы

Сортировка многомерного массива по значению одного из ключей

Предположим, что у нас есть такой массив

Скопировано
$arr = [
[ 'id' => 1, 'age' => 15, 'name' => 'Вася' ],
[ 'id' => 2, 'age' => 31, 'name' => 'Петя' ],
[ 'id' => 3, 'age' => 20, 'name' => 'Оля' ]
];
Показать код

и мы хотим отсортировать его по значению ключа age по возрастанию:

Скопировано
uasort( $arr, function( $a, $b ) {
return $a['age'] > $b['age'];
});
Показать код

Результат:

Array (
  [0] => Array (
    [id] => 1
    [age] => 15
    [name] => Вася
  )
  [2] => Array (
    [id] => 3
    [age] => 20
    [name] => Оля
  )
  [1] => Array (
    [id] => 2
    [age] => 31
    [name] => Петя
  )
)

Сортировка многомерного массива по нескольким столбцам одновременно.

Допустим, есть массив вида:

Скопировано
$arr = [
[ 'ID' => 1, 'name' => 'Наташа', 'age' => '12' ],
[ 'ID' => 2, 'name' => 'Женя', 'age' => '25' ],
[ 'ID' => 3, 'name' => 'Оля', 'age' => '14' ],
[ 'ID' => 4, 'name' => 'Петя', 'age' => '43' ],
[ 'ID' => 5, 'name' => 'Дима', 'age' => '21' ],
[ 'ID' => 6, 'name' => 'Вася', 'age' => '43' ],
[ 'ID' => 7, 'name' => 'Света', 'age' => '14' ]
];
Показать код

и мы хотим отсортировать его сначала по столбцу age по убыванию, а затем по столбцу name по возрастанию. Можно сделать так:

Скопировано
$temp_arr = [];
foreach( $arr as $k => $v ) {
	$temp_arr['name'][$k] = $v['name'];
	$temp_arr['age'][$k] = $v['age'];
}
array_multisort( $temp_arr['age'], SORT_DESC, $temp_arr['name'], SORT_ASC, $arr );
Показать код

Результат:

Array (
  [0] => Array (
    [ID] => 6
    [name] => Вася
    [age] => 43
  )
  [1] => Array (
    [ID] => 4
    [name] => Петя
    [age] => 43
  )
  [2] => Array (
    [ID] => 2
    [name] => Женя
    [age] => 25
  )
  [3] => Array (
    [ID] => 5
    [name] => Дима
    [age] => 21
  )
  [4] => Array (
    [ID] => 3
    [name] => Оля
    [age] => 14
  )
  [5] => Array (
    [ID] => 7
    [name] => Света
    [age] => 14
  )
  [6] => Array (
    [ID] => 1
    [name] => Наташа
    [age] => 12
  )
)

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

Пусть есть два массива:

Скопировано
$arr1 = [
[ 'id' => '1', 'name' => 'Петя', 'age' => '20' ],
[ 'id' => '2', 'name' => 'Вася', 'age' => '35' ],
[ 'id' => '5', 'name' => 'Оля', 'age' => '24' ]
];
$arr2 = [
[ 'color' => 'red', 'label' => 'Вася' ],
[ 'color' => 'white', 'label' => 'Дима' ],
[ 'color' => 'black', 'label' => 'Оля' ],
[ 'color' => 'orange', 'label' => 'Петя' ]
];
Показать код

и мы хотим отсортировать первый по ключу name в том порядке, в каком значения этого ключа встречаются во втором массиве в ключе label. Код может быть таким:

Скопировано
$sorted = [];
foreach( $arr1 as $row ) {
$idx = array_search( $row['name'], array_column( $arr2, 'label' ) );
$sorted[$idx] = $row;
}
ksort( $sorted );
Показать код

В итоге переменная $sorted будет содержать такой массив:

Array (
  [0] => Array (
    [id] => 2
    [name] => Вася
    [age] => 35
  )
  [2] => Array (
    [id] => 5
    [name] => Оля
    [age] => 24
  )
  [3] => Array (
    [id] => 1
    [name] => Петя
    [age] => 20
  )
)