Как отобразить что-то только для первого элемента из коллекции в шаблоне 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