Как отобразить что-то только для первого элемента из коллекции в шаблоне Laravel Blade

У меня есть цикл @foreach в шаблоне Blade и необходимо применить специальное форматирование к первому элементу коллекции. Как добавить условие, чтобы проверить, является ли это первым элементом?

@foreach($items as $item)
    <h4>{{ $item->program_name }}</h4>
@endforeach`

Ответ 1

СоХо,

Самый быстрый способ - сравнить текущий элемент с первым элементом в массиве:

@foreach($items as $item)
    @if ($item == reset($items )) First Item: @endif
    <h4>{{ $item->program_name }}</h4>
@endforeach

Или иначе, если это не ассоциативный массив, вы можете проверить значение индекса в соответствии с вышеприведенным ответом, но это не сработает, если массив ассоциативен.

Ответ 2

Laravel 5.3 предоставляет переменную $loop в циклах foreach.

@foreach ($users as $user)
    @if ($loop->first)
        This is the first iteration.
    @endif

    @if ($loop->last)
        This is the last iteration.
    @endif

    <p>This is user {{ $user->id }}</p>
@endforeach

Документы: https://laravel.com/docs/5.3/blade#the-loop-variable

Ответ 3

Просто возьмите значение ключа

@foreach($items as $index => $item)
    @if($index == 0)
        ...
    @endif
    <h4>{{ $item->program_name }}</h4>
@endforeach

Ответ 4

Основная проблема с ответом Лиама Уилтшира - это производительность, потому что:

  • reset ($ items) перематывайте указатель коллекции $items снова и снова в каждом цикле... всегда с тем же результатом.

  • Оба $item, а результат reset ($ item) - это объекты, поэтому $item == reset ($ элементы) требует полного сравнения своих атрибутов... требуя большего времени процессора.

Более эффективный и элегантный способ сделать это, как предлагает Шеннон, - использовать переменную Blade $loop:

@foreach($items as $item)
    @if ($loop->first) First Item: @endif
    <h4>{{ $item->program_name }}</h4>
@endforeach

Если вы хотите применить специальный формат к первому элементу, возможно, вы могли бы сделать что-то вроде (используя тернарный условный оператор ?:):

@foreach($items as $item)
    <h4 {!! $loop->first ? 'class="special"': '' !!}>{{ $item->program_name }}</h4>
@endforeach

Обратите внимание на использование тегов {!! и !!} вместо обозначения {{ }}, чтобы избежать кодирования html двойных кавычек вокруг строки special.

С уважением.

Ответ 5

В laravel 5.8 вы также можете сделать что-то вроде этого:

@foreach($items as $item)
 @if ($loop->first)
    This is the first iteration.
 @endif
@endforeach

документы: https://laravel.com/docs/5.8/blade#loops

Ответ 6

Чтобы получить первый элемент коллекции в Laravel, вы можете использовать:

@foreach($items as $item)
    @if($item == $items->first()) {{-- first item --}}
        <h4>{{$item->program_name}}</h4>
    @else
        <h5>{{$item->program_name}}</h5>
    @endif
@endforeach