Элегантный способ разбить красноречивую коллекцию на блоки по алфавиту

Мне нужно отсортировать коллекцию из моей базы данных, например, https://www.bodybuilding.com/store/listing.htm

Я мог бы написать это, но я, вероятно, также потеряю красноречивые отношения, которые не идеальны.

Это похоже на то, что Laravel что-то может сделать из коробки или с очень небольшой логикой.

Какие-либо предложения?

Зайдите в laravel.com/docs/master/collections#method-sortby, чтобы отсортировать вашу коллекцию. Вам, вероятно, придется добавить чек на изменение первой буквы, чтобы добавить новый заголовок.

aynber 13.12.2018 17:21

На самом деле нет готового решения для orderAndGroupByFirstLetter() (это то, что вы описываете), но коллекции Laravel, которые являются результатом запроса, имеют множество доступных методов для решения этой проблемы, например sortBy(). , filter(), mapToGroups() и т. д. Посмотрите, сможете ли вы написать что-нибудь, и задайте более конкретный вопрос, если у вас возникнут какие-либо проблемы.

Tim Lewis 13.12.2018 17:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
986
4

Ответы 4

Ознакомьтесь с документацией Laravel https://laravel.com/docs/5.7/eloquent#retrieving-models

$listing = App\Store::where('first_letter', 'a')
               ->orderBy('name', 'desc')
               ->take(10)
               ->get();

Если вам нужно что-то более конкретное, вы всегда можете создать Scopes и использовать его в своих красноречивых моделях. https://laravel.com/docs/5.7/eloquent#query-scopes

Предположим, что модель называется Categories с полем name, и вам необходимо сгруппировать категории по первой букве их имени. Каждая категория, первая буква которой не является алфавитным символом, будет сгруппирована под символом '#':

$collection = Categories::get();
$grouped = $collection->groupBy(function ($item, $key) {
    $letter = $item->name[0];
    if (ctype_alpha($letter)) {
        return $letter;
    }
    return '#';
});

mapToGroups - это то, что я искал. Вот мое решение.

public function chunkByAlpha(Collection $collection)
{
    return $collection->mapToGroups(function($item, $key) {

        return ($this->isAlpha($item->name[0]) ? [strtoupper($item->name[0]) => $item] : ['#' => $item]);
    });
}

public function isAlpha($toCheck)
{
    return preg_match("/^[a-zA-Z]+$/", $toCheck);
}

Вроде бы обычного foreach() хватило бы

$ordered = [];
foreach ($items as $item) {
    $key = ctype_alpha($item->attribute[0]) ? $item->attribute[0] : 'other';
    $ordered[$item->attribute[0]][] = $item;
}

Вышеупомянутый создает ассоциативный массив с буквой в качестве ключа - и помещает все элементы без альфа в другие

Другие вопросы по теме