web-dev-qa-db-fra.com

Comment afficher quelque chose uniquement pour le premier article de la collection dans Laravel Modèle de lame

J'ai une boucle @foreach dans le modèle Blade et je dois appliquer un formatage spécial au premier élément de la collection. Comment puis-je ajouter une condition pour vérifier s'il s'agit du premier élément?

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

SoHo,

Le moyen le plus rapide consiste à comparer l'élément en cours avec le premier élément du tableau:

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

Sinon, si ce n'est pas un tableau associatif, vous pouvez vérifier la valeur d'index selon la réponse ci-dessus - mais cela ne fonctionnerait pas si le tableau était associatif.

9
Liam Wiltshire

Laravel 5.3 fournit une variable $loop dans des boucles 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

Docs: https://laravel.com/docs/5.3/blade#the-loop-variable

41
Shannon

Il suffit de prendre la valeur clé

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

Le problème majeur de la réponse de Liam Wiltshire est la performance parce que:

  1. reset ($ items) rembobine le pointeur de $ items collection encore et encore à chaque boucle ... toujours avec le même résultat.

  2. Les deux $ item et le résultat de reset ($ item) sont des objets, donc $ item == reset ($ items) nécessite une comparaison complète de ses attributs ... demandant davantage de processeurs temps.

Une manière plus efficace et élégante de faire cela -comme le suggère Shannon s- est d'utiliser la boucle $ de la lame variable:

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

Si vous souhaitez appliquer un format spécial au premier élément, vous pourriez peut-être faire quelque chose comme (en utilisant l'opérateur conditionnel ternaire?: ):

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

Notez l'utilisation des balises {!! et !!} au lieu de la notation {{}} pour éviter l'encodage HTML des guillemets autour despécialstring.

Cordialement.

0
Omar Vargas