Оглавление
Сортировка массива по ключу
Функцииksort()
и krsort()
сортируют массивы по ключу, в порядке возрастания ключа и убывания соответственно.
$arr = [
2 => 'Январь',
1 => 'Февраль',
3 => 'Март',
];
//Сортировка по возрастанию
ksort($arr);
echo '<pre>';
print_r($arr);
echo '</pre>';
Результат:
Array
(
[1] => Февраль
[2] => Январь
[3] => Март
)
И в обратном порядке$arr = [
2 => 'Январь',
1 => 'Февраль',
3 => 'Март',
];
//Сортировка по убыванию
krsort($arr);
echo '<pre>';
print_r($arr);
echo '</pre>';
Результат:
Array
(
[3] => Март
[2] => Январь
[1] => Февраль
)
Сортировка массива по значению
Аналогично сортировке по ключам, вы можете отсортировать одномерный массив по значению используя функцииsort()
и rsort()
сортировка так же идёт по возрастанию и убыванию значения (или в алфавитном порядке). При использовании этих функций, ключи не сохранятся.
$arr = [1, 3, 5, 0, 22, 17, 4, 6, 9];
//Сортировка по возрастанию
sort($arr);
echo '<pre>';
print_r($arr);
echo '</pre>';
Результат:
Array
(
[0] => 0
[1] => 1
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => 9
[7] => 17
[8] => 22
)
И для строковых значений
$arr = ['Валера', 'Светлана', 'Борис', 'Александр'];
//Сортировка по возрастанию
sort($arr);
echo '<pre>';
print_r($arr);
echo '</pre>';
Результат:
Array
(
[0] => Александр
[1] => Борис
[2] => Валера
[3] => Светлана
)
Если вам нужно сохранить ключи, при сортировке по значению, используйте asort()
и arsort()
.
$arr = [
'manager' => 'Валера',
'marketing_specialist' => 'Светлана',
'accountant' => 'Борис',
'programmer' => 'Александр'
];
//Сортировка по возрастанию
asort($arr);
echo '<pre>';
print_r($arr);
echo '</pre>';
Результат:
Array
(
[programmer] => Александр
[accountant] => Борис
[manager] => Валера
[marketing_specialist] => Светлана
)
Существует так же возможность отсортировать массив, используя свой алгоритм сравнения элементов в процессе сортировки. Для этого нам потребуется функция usort()
, она принимает массив и имя callback-функции которая будет вызвана для каждого сравнения элементов.
//Функция сравнения, тут сортируем по чётным и не чётным элементам
function compare($a, $b)
{
if ($a == $b) {
return 0;
}
$ares = $a % 2;
$bres = $b % 2;
return ($ares < $bres) ? -1 : 1;
}
//Заданный массив с числами
$numbers = [3, 2, 5, 6, 1, 9, 12, 8, 10];
//Вызываем функцию usort() передав ей массив и имя нашей пользовательской функции сравнения
usort($numbers, 'compare');
echo '<pre>';
print_r($numbers);
echo '</pre>';
Результат:
Array
(
[0] => 8
[1] => 10
[2] => 6
[3] => 12
[4] => 2
[5] => 9
[6] => 1
[7] => 5
[8] => 3
)
Как видите чётные элементы идут вначале. Алгоритм функции compare()
может быть любым, под ваши задачи. Вы так же можете пробросить в тело функции compare()
внешнюю переменную используя анонимную функцию и ключевое слово use
:
$params = ['min_value'=>0, 'max_value'=>3];
function compare($params){
return function ($a, $b) use ($params)
{
if ($a == $b) {
return 0;
}
if($a < $b && $a >= $params['min_value'] && $a <= $params['max_value']){
return -1;
} else {
return 1;
}
};
}
//Заданный массив с числами идущими не по порядку
$numbers = [3, 2, 5, 6, 1];
//Вызываем функцию usort() передав ей массив и имя нашей пользовательской функции сравнения
usort($numbers, compare($params));
Результат:Аrray(5) { [0]=>int(1) [1]=>int(2) [2]=>int(3) [3]=>int(6) [4]=>int(5) }
Естественная сортировка массива
У вышеописанных функций сортировки есть дополнительные возможности, позволяющих поменять алгоритм сортировки, сделав её более естественно для человека. Для этого в функцииsort()
, rsort()
, asort()
, arsort()
можно передать второй параметр, который поменяет поведение функции. Доступные параметры:- SORT_REGULAR - обычное сравнение элементов
- SORT_NUMERIC - числовое сравнение элементов
- SORT_STRING - строковое сравнение элементов
- SORT_LOCALE_STRING - сравнение элементов как строки на основе текущего языкового стандарта. Используется языковой стандарт, который можно изменить с помощью setlocale()
- SORT_NATURAL - сравнение элементов как строки, используя "естественный порядок", например natsort()
- SORT_FLAG_CASE - можно объединять (побитовое ИЛИ) с SORT_STRING или SORT_NATURAL для сортировки строк без учёта регистра
$arr = [-1, 0, 10, 2, 5, 'текст', 'a', 'b', true];
//Обычная сортировка по значению
sort($arr);
echo '<pre>';
print_r($arr);
echo '</pre>';
echo '-------------------<br/>';
sort($arr, SORT_NATURAL);
echo '<pre>';
print_r($arr);
echo '</pre>';
Результат:
Array
(
[0] => -1
[1] => 0
[2] => a
[3] => b
[4] => текст
[5] => 2
[6] => 5
[7] => 10
[8] => 1
)
-------------------
Array
(
[0] => -1
[1] => 0
[2] => 1
[3] => 2
[4] => 5
[5] => 10
[6] => a
[7] => b
[8] => текст
)
Согласитесь, второй вариант более "человечный".Сортировка многомерного массива
Функцияarray_multisort()
сортирует несколько массивов или многомерные массивы по значению. Принимает в качестве параметра массив и флаг направления сортировка SORT_ASC
или SORT_DESC
.
$arr = [
[6, 5, 8, 48, 58, 65, 123],
[1, 150, 2, 3, 80, 33, 22]
];
array_multisort($arr);
echo '<pre>';
print_r($arr);
echo '</pre>';
Результат:
Array
(
[0] => Array
(
[0] => 1
[1] => 150
[2] => 2
[3] => 3
[4] => 80
[5] => 33
[6] => 22
)
[1] => Array
(
[0] => 6
[1] => 5
[2] => 8
[3] => 48
[4] => 58
[5] => 65
[6] => 123
)
)
Сортировка многомерного массива по значению определённого ключа
Если например у нас есть массив товаров с ценами и нам нужно отсортировать их в порядке возрастания цены не обращая внимания на остальные поля, нам потребуется написать пользовательскую функцию сравнения и вызватьuasort()
передав ей массив и нашу пользовательскую функцию. uasort()
сохранит ключи массива и не сломает дальнейшую работу с товарами.
//Функция сравнения по ключу price
function compare($a, $b){
if ($a['price'] == $b['price']) {
return 0;
}
return ($a['price'] < $b['price']) ? -1 : 1;
}
//Массив товаров
$products = [
[
'id' => 1,
'name' => 'Товар 1',
'price' => 15,
'quantity' => 10
],
[
'id' => 2,
'name' => 'Товар 2',
'price' => 100,
'quantity' => 8
],
[
'id' => 3,
'name' => 'Товар 3',
'price' => 75,
'quantity' => 12
],
[
'id' => 4,
'name' => 'Товар 4',
'price' => 100,
'quantity' => 25
],
];
//Сортируем по цене
uasort($products, 'compare');
echo '<pre>';
print_r($products);
echo '</pre>';
Результат
Array
(
[0] => Array
(
[id] => 1
[name] => Товар 1
[price] => 15
[quantity] => 10
)
[2] => Array
(
[id] => 3
[name] => Товар 3
[price] => 75
[quantity] => 12
)
[1] => Array
(
[id] => 2
[name] => Товар 2
[price] => 100
[quantity] => 8
)
[3] => Array
(
[id] => 4
[name] => Товар 4
[price] => 100
[quantity] => 25
)
)
В итоге получаем отсортированный по возрастанию цены список товаров.