Сортировка массивов
Одномерные массивы
Сортировка по возрастанию значений с сохранением ключей
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
)
)