Сортировка массива по нескольким полям/колонкам
Представим, что у нас есть список мебели, где указан тип мебели (категория) и название.
И нам нужно отсортировать массив, сначала по категории, а потом внутри категории по по названию.
Наш массив будет выглядеть следующим образом:
$array = [
[
'category' => 'table',
'name' => 'qwerty'
], [
'category' => 'chair',
'name' => 'askon'
], [
'category' => 'table',
'name' => 'zed'
], [
'category' => 'table',
'name' => 'akil'
], [
'category' => 'chair',
'name' => 'xdb'
], [
'category' => 'door',
'name' => 'alx'
], [
'category' => 'table',
'name' => 'nix'
], [
'category' => 'chair',
'name' => 'lol'
], [
'category' => 'door',
'name' => 'smile'
], [
'category' => 'floor',
'name' => 'down'
], [
'category' => 'door',
'name' => 'avt'
], [
'category' => 'chair',
'name' => 'vix'
], [
'category' => 'door',
'name' => 'zeon'
]
];
В массиве категории и названия перемешаны в хаотичном порядке.
Для сортировки массива воспользуемся функцией
usort.
Внутри функции
usort, отсортируем массив по алфавиту, по категории "
category" с сортировкой по алфавиту.
В случае, если категории сравниваемых элементов массива равны, то сравниваем по имени "
name" и возвращаем направление сортировки в виде значений 1,-1 и 0.
usort($array, function ($a, $b) {
if ($a['category'] === $b['category']) {
if ($a['name'] < $b['name']) {
return -1;
}
if ($a['name'] > $b['name']) {
return 1;
}
if ($a['name'] <=> $b['name']) {
return 0;
}
}
if ($a['category'] < $b['category']) {
return -1;
}
if ($a['category'] > $b['category']) {
return 1;
}
});
После выполнения функции
usort массив
$array будет выглядеть следующим образом:
Array
(
[0] => Array
(
[category] => chair
[name] => askon
)
[1] => Array
(
[category] => chair
[name] => lol
)
[2] => Array
(
[category] => chair
[name] => vix
)
[3] => Array
(
[category] => chair
[name] => xdb
)
[4] => Array
(
[category] => door
[name] => alx
)
[5] => Array
(
[category] => door
[name] => avt
)
[6] => Array
(
[category] => door
[name] => smile
)
[7] => Array
(
[category] => door
[name] => zeon
)
[8] => Array
(
[category] => floor
[name] => down
)
[9] => Array
(
[category] => table
[name] => akil
)
[10] => Array
(
[category] => table
[name] => nix
)
[11] => Array
(
[category] => table
[name] => qwerty
)
[12] => Array
(
[category] => table
[name] => zed
)
)
Поставленная задача выполнена. Мы отсортировали массив по категориям и после этого в каждой категории отсортировали мебель по алфавиту.
Весь код из данного примера:
<?php
$array = [
[
'category' => 'table',
'name' => 'qwerty'
], [
'category' => 'chair',
'name' => 'askon'
], [
'category' => 'table',
'name' => 'zed'
], [
'category' => 'table',
'name' => 'akil'
], [
'category' => 'chair',
'name' => 'xdb'
], [
'category' => 'door',
'name' => 'alx'
], [
'category' => 'table',
'name' => 'nix'
], [
'category' => 'chair',
'name' => 'lol'
], [
'category' => 'door',
'name' => 'smile'
], [
'category' => 'floor',
'name' => 'down'
], [
'category' => 'door',
'name' => 'avt'
], [
'category' => 'chair',
'name' => 'vix'
], [
'category' => 'door',
'name' => 'zeon'
]
];
usort($array, function ($a, $b) {
if ($a['category'] === $b['category']) {
if ($a['name'] < $b['name']) {
return -1;
}
if ($a['name'] > $b['name']) {
return 1;
}
if ($a['name'] <=> $b['name']) {
return 0;
}
}
if ($a['category'] < $b['category']) {
return -1;
}
if ($a['category'] > $b['category']) {
return 1;
}
});
print_r('<pre>');
print_r($array);
die();
Начиная с версии php 7.0 появился оператор spaceship <=> (Космический корабль). С помощью данного оператора можно сократить длину кода в функции usort:
usort($array, function ($a, $b) {
if ($a['category'] === $b['category']) {
return $a['name'] <=> $b['name'];
}
if ($a['category'] < $b['category']) {
return -1;
}
if ($a['category'] > $b['category']) {
return 1;
}
});
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.