Циклы в шаблонизаторе Blade в Laravel
Шаблонизатора Blade в Laravel позволяет использовать не только примитивную логику для организации HTML кода вывода. Он ещё и обладает функционалом для создания циклом. Делается это с помощью директивы @foreach. Продемонстрируем его работу на примере:
@foreach ($ar as $el) > @endforeach
Этот код выводит значения всех элементов массива «$ar». Как можно заметить логика синтаксиса очень похожа на конструкцию foreach в PHP. Используя тот же синтаксис, что и у PHP, можно привести пример вывода пары ключ-значение:
@foreach ($ar as $key => $el) Ключ: >, значение: > @endforeach
Если массив использовался ассоциативный многомерный массив, то существует возможность обращения к элементу массива по ключу внутри этого цикла:
@foreach ($ar as $el) Имя: >, возраст: > @endforeach
@foreach ($ar as $key => $el) @if ($el > 0) Ключ: >, значение: > @endif @endforeach
Но на этом комбинации не исчерпываются: можно даже использовать один цикл внутри другого для перебора многомерных массивов. Это часто используется при построении таблиц, для программирования вывода строк и ячеек:
@foreach ($arFirst as $keyFirst => $arSecond) @foreach ($arSecond as $keySecond => $elSecond) @if ($elSecond > 0) Ключ из первого цикла: >
Ключ из второго цикла: >
Значение из второго цикла: > @endif @endforeach @endforeach
Цикл for
Аналогично PHP, Blade умеет работать с простейшим циклом «for», у которого задан шаг, минимальное и максимальное значение:
Цикл forelse
Такой код будет выводить пару ключ-значение только если значение больше нуля. А с помощью такого кода можно выводить значение только есть массив не является пустым:
@if ( count($ar) ) @foreach ($ar as $el) > @endforeach @else Массив пустой! @endif
Благодаря шаблонизатору Blade можно переписать этот код более компактно с помощью «@forelse«, при этом не потеряв логики (код будет делать то же самое):
@forelse ($ar as $el) > @empty Массив пустой! @endforelse
«forelse» выполняет цикл только в том случае, если обходимый массив не является пустым. Если же он пустой, то выполняется директива «@empty«, которая ставится после него.
Операции внутри цикла
Как и язык программирования PHP, шаблонизатор Blade умеет распознавать различные операции внутри цикла. К примеру, аналоги этих операций: «@break» (прерывает цикл) и «@continue» (приступает к следующей итерации цикла). Продемонстрируем их работу:
@foreach ($ar as $key => $el) @if ($el == 5) Ключ: >, значение: > Прерываем цикл! @break @endif @if ($el > 10) Переходим к следующей итерации! @continue @endif @endforeach
Переменная $loop внутри цикла
Внутри циклов существует специальная переменная $loop. Она записывается не как директива, а именно переменная (со знаком доллара в начале). В значение этой переменной попадает текущий индекс цикла. С помощью неё можно узнать на какой итерации цикла сейчас находимся. Это делается так:
@foreach ($ar as $key => $el) @if ($loop->first) Это первая итерация @endif @if ($loop->last) Это последняя итерация @endif @endforeach
Переменная $loop содержит несколько полезных свойств:
Свойство | Описание |
---|---|
$loop->index | Индекс текущей итерации цикла (начинается с 0). |
$loop->iteration | Текущая итерация цикла(начинается с 1). |
$loop->remaining | Число оставшихся итераций цикла. |
$loop->count | Общее число элементов итерируемого массива. |
$loop->first | Первая ли это итерация цикла. |
$loop->last | Последняя ли это итерация цикла. |
$loop->depth | Уровень вложенности текущего цикла. |
$loop->parent | Переменная loop родительского цикла, для вложенного цикла. |
Если цикл вложенный, то к переменной $loop родительского цикла можно обратиться через свойство parent:
@foreach ($arFirst as $keyFirst => $arSecond) @foreach ($arSecond as $keySecond => $elSecond) @if ($loop->parent->first) Это первая итерация родительского цикла @endif @if ($loop->first) Это первая итерация сложенного цикла @endif @endforeach @endforeach