lina666
@lina666
Изучаю веб ЯП.

Как укоротить функцию?

Народ такой вопрос , есть функция сортировки, когда сдавала ее на проверку мне сказали что ее можно сделать в 1 строчку, у меня лично получается вот такой код
Вот ТЗ к функции:
Создайте массив меню: каждый элемент массива (т.е. каждый пункт меню) должен содержать ключи 'title' - название пункта меню, 'sort' - индекс сортировки (число), 'path' - url.
Создайте вспомогательную функцию arraySort($array, $key = 'sort', $sort = SORT_ASC) и реализуйте ее, эта функция должна отсортировать массив по указанному ключу в указанном направлении (SORT_ASC - по возрастанию, SORT_DESC - по убыванию - встроенные в php константы), если параметр $sort указан не верно, то по-умолчанию выполняется сортировка по возрастанию.
Отсортируйте массив меню по ключу sort по возрастанию, выведите его, а затем отсортируйте по убыванию и снова выведите.
Кому не влом покажите как можно расписать данную задачу в пару строк.
function arraySort($array, $sort = SORT_ASC , $key ='sort' )
{ 
    //Переделать, как это было сказанно.  
    usort($array, function($lt, $rt) use ($key, $sort): int 
    {
        // возрастание
        if ($sort == SORT_ASC or $sort != SORT_ASC and $sort !== SORT_DESC) {   
            return ($lt[$key] <=> $rt[$key]);   
        }
        
        // убывание 
        return ($rt[$key] <=> $lt[$key]);
    });

    foreach ($array as $item) {
        $items[] = [$item['title'], $item['path'], $item['title']];
    }

   return $items;
}
  • Вопрос задан
  • 651 просмотр
Решения вопроса 2
glaphire
@glaphire Куратор тега PHP
PHP developer
function arraySort(array &$array, $sort = SORT_ASC) {
     uasort($array, function($a, $b) use ($sort) {
        return ($sort === SORT_ASC) ? $a['sort'] <=> $b['sort'] : $b['sort'] <=> $a['sort'];
    });
}

Сравнение ($sort === SORT_ASC) идет потому, что SORT_ASC это 4, а SORT_DESC это 3, поэтому тернарный оператор надо строить на сравнении с константой, а не просто значением sort.
Ответ написан
@neol
Если надо кровь из носа уложиться в одну строку, то
function arraySort(&$array, $key ='sort', $sort = SORT_ASC)
{
    array_multisort(array_column($array, $key), in_array($sort, [SORT_ASC, SORT_DESC]) ? $sort : SORT_ASC, $array);
}

но на мой взгляд лучше так

function arraySort(&$array, $key ='sort', $sort = SORT_ASC)
{
    $sortArray = array_column($array, $key);
    $sortOrder = in_array($sort, [SORT_ASC, SORT_DESC]) ? $sort : SORT_ASC;
    array_multisort($sortArray, $sortOrder, $array);
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы