Сортування колекцій Laravel за власними ключами

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 17 березня, 2025
Ви хочете дізнатися, як покращити управління даними у вашому Laravel-додатку? У нашій статті ми розглядаємо метод sortKeysUsing, який дозволяє налаштувати порядок ключів колекцій для досягнення максимальної зручності та логічності в обробці даних

Метод sortKeysUsing у Laravel дозволяє детально контролювати порядок ключів колекцій, що дає змогу реалізувати кастомну логіку сортування, виходячи за межі стандартного алфавітного порядку

Ця функція особливо корисна при роботі з масивами конфігурацій, формами з визначеними порядками відображення тощо, коли послідовність ключів важлива для обробки чи відображення

$collection->sortKeysUsing('strnatcasecmp');
 
// або
 
$collection->sortKeysUsing(function ($a, $b) {
    return $a <=> $b;
});

Ось приклад реалізації пріоритетного порядку меню:

<?php
 
namespace App\Services;
 
use Illuminate\Support\Collection;
 
class NavigationManager
{
    public function getOrderedNavigation(array $menuItems): Collection
    {
        return collect($menuItems)
            ->sortKeysUsing(function ($a, $b) {
                // Витягуємо префікси позицій (pos1_, pos2_ тощо)
                $positionA = $this->extractPosition($a);
                $positionB = $this->extractPosition($b);
 
                // Якщо обидва мають префікси, сортуємо за числовим значенням
                if ($positionA !== null && $positionB !== null) {
                    return $positionA <=> $positionB;
                }
 
                // Префікси позицій йдуть перед ключами без префіксів
                if ($positionA !== null) return -1;
                if ($positionB !== null) return 1;
 
                // Групуємо елементи за секцією
                $sectionA = explode('_', $a)[0];
                $sectionB = explode('_', $b)[0];
 
                if ($sectionA !== $sectionB) {
                    // Користувацький порядок секцій
                    $sections = ['dashboard', 'users', 'content', 'settings'];
                    $indexA = array_search($sectionA, $sections);
                    $indexB = array_search($sectionB, $sections);
 
                    if ($indexA !== false && $indexB !== false) {
                        return $indexA <=> $indexB;
                    }
                }
 
                // За замовчуванням сортуємо в природному, нечутливому до регістру порядку
                return strnatcasecmp($a, $b);
            });
    }
 
    private function extractPosition(string $key): ?int
    {
        if (preg_match('/^pos(\d+)_/', $key, $matches)) {
            return (int) $matches[1];
        }
 
        return null;
    }
}

Метод sortKeysUsing змінює порядок упорядкування даних колекції, що дозволяє встановлювати семантичний порядок відповідно до специфічних вимог вашого застосунку