Сортировка массива по значению ключа на любом уровне вложенности
Для сортировки не будем использовать никакую array_flip(), которая меняет ключи и значения местами. Тем более, что она абсолютно никак не поможет для решения данной задачи в случае многомерного массива.
Привожу удобную функцию, которая сортирует массив по значению ключа. Массив при этом может быть как одномерный, так и многомерный. Направление задается параметром.
<?php
function sort_array_by_key_value(&$array, $key, $asc = true)
{
usort($array, function ($a, $b) use ($key, $asc) {
$aValue = array_get($a, $key);
$bValue = array_get($b, $key);
return $asc ? $aValue > $bValue : $aValue < $bValue;
});
}
function array_get($array, $key, $default = null)
{
if (!is_array($array)) {
return $default;
}
if (array_key_exists($key, $array)) {
return $array[$key];
}
$key = explode('.', $key);
$innerKey = array_shift($key);
if (array_key_exists($innerKey, $array)) {
$array = $array[$innerKey];
} else {
return $default;
}
return array_get($array, implode('.', $key));
}
Для удобного получения значения по ключу на любом уровне вложенности, здесь используется дополнительная функция array_get(). Подробнее об этой функции я рассказывал здесь.
Использование:
<?php
$list = [
[
//...другие поля
'USER' => [
//...другие поля
'NAME' => 'Петр',
],
],
[
//...другие поля
'USER' => [
//...другие поля
'NAME' => 'Иван',
],
],
];
sort_array_by_key_value($list, 'USER.NAME');
В данном примере массив $list будет отсортирован по ключу NAME, который находится внутри ключа USER, а вся структура многомерного массива сохранится.
Оставьте комментарий
Если эта статья была полезной для вас, оставьте комментарий ниже или задайте интересующий Вас вопрос. Ваш опыт может помочь другим читателям!
Написать комментарий