Метод 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 змінює порядок упорядкування даних колекції, що дозволяє встановлювати семантичний порядок відповідно до специфічних вимог вашого застосунку