如何在Laravel Blade模板中仅为集合中的第一个项目显示某些内容

38

我在Blade模板中有一个@foreach循环,需要对集合中的第一项应用特殊格式。如何添加条件语句来检查这是否是第一项?

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

123
Laravel在foreach循环中提供了一个$loop变量。
@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/10.x/blade#the-loop-variable


2
正是我所需要的。谢谢你! - Sheldon Scott
1
这应该是最好的答案。 - Ken
1
太棒了!它仍然可以在Laravel 5.8上运行。 - Marcello Pato

12

苏荷区,

最快的方法是将当前元素与数组中的第一个元素进行比较:

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

或者,如果它不是一个关联数组,你可以按照上面的答案检查索引值-但如果数组是关联数组,则这种方法不起作用。


你和@gumma-mocciaro的解决方案在我的情况下都可以工作。这个更简短。 - SoHo
对我来说运行得非常完美! - Brnovich

8

只需获取键值即可

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

4
如果第一个项目的索引不是零,这将会失败。 - David Harkness
3
即使$items不是一个数组,这仍将失败 :)。 - Gumma Mocciaro

7
从Laravel 7.25开始,Blade现在包括一个新的@once组件,因此您可以像这样操作:
@foreach($items as $item)
    @once
    <h4>{{ $item->program_name }}</h4>  // Displayed only once
    @endonce
    // ... rest of looped output
@endforeach

6

Laravel 7.* 提供了一个first()辅助函数。

{{ $items->first()->program_name }}
*请注意,我不确定这是何时引入的。因此,在早期版本中可能无法使用。

该功能仅在文档中简要提到


3
Liam Wiltshire的回答存在主要问题,即性能问题,因为:
1. reset($items)会在每个循环中反复重置$items集合的指针...总是得到相同的结果。
2. $item和reset($item)的结果都是对象,所以$item == reset($items)需要完全比较其属性...需要更多的处理器时间。
一种更高效、更优雅的方法-正如Shannon建议的那样-是使用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编码。
敬礼。

1
如果你只需要第一个元素,可以在你的@foreach或@if中使用@break。例如:
@foreach($media as $m)
    @if ($m->title == $loc->title) :
        <img class="card-img-top img-fluid" src="images/{{ $m->img }}">
          
        @break
    @endif
@endforeach

0

你可以这样做。

collect($users )->first();

-3

在 Laravel 中获取集合的第一个元素,您可以使用:

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

问题是关于 Blade 模板系统,而不是 Laravel 本身。 - bfontaine
问题涉及 LARAVEL Blade。请阅读问题。 - w2d
Blade是Laravel中包含的模板系统。OP并不是在问整个Laravel,而是在问Blade本身。你的回答没有解决OP的问题,这一点可以从负评和其他人的回答中看出来。 - bfontaine
问题是: 如何在Laravel Blade模板中仅为集合中的第一项显示某些内容。注意,问题中提到了LARAVEL! - w2d
问题中有“Laravel Blade”,不仅仅是“Laravel”。 - bfontaine
最佳答案引用了 Laravel 5.3! - w2d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接