Шаблонизатора Blade в Laravel позволяет использовать не только примитивную логику для организации HTML кода вывода. Он ещё и обладает функционалом для создания циклом. Делается это с помощью директивы
@foreach. Продемонстрируем его работу на примере:
@foreach ($ar as $el)
<div>{{ $el }}</div>
@endforeach
Этот код выводит значения всех элементов массива "$ar". Как можно заметить логика синтаксиса очень похожа на конструкцию
foreach в PHP. Используя тот же синтаксис, что и у PHP, можно привести пример вывода пары ключ-значение:
@foreach ($ar as $key => $el)
<div>Ключ: {{ $key }}, значение: {{ $el }}</div>
@endforeach
Если массив использовался ассоциативный многомерный массив, то существует возможность обращения к элементу массива по ключу внутри этого цикла:
@foreach ($ar as $el)
<div>Имя: {{ $el['name'] }}, возраст: {{ $el['age'] }}</div>
@endforeach
Цикл может комбинироваться в коде с другими директивами, к примеру с условиями:
@foreach ($ar as $key => $el)
@if ($el > 0)
<div>Ключ: {{ $key }}, значение: {{ $el }}</div>
@endif
@endforeach
Но на этом комбинации не исчерпываются: можно даже использовать один цикл внутри другого для перебора многомерных массивов. Это часто используется при построении таблиц, для программирования вывода строк и ячеек:
@foreach ($arFirst as $keyFirst => $arSecond)
@foreach ($arSecond as $keySecond => $elSecond)
@if ($elSecond > 0)
<div>
Ключ из первого цикла: {{ $keyFirst }}<br>
Ключ из второго цикла: {{ $keySecond }}<br>
Значение из второго цикла: {{ $elSecond }}<br>
</div>
@endif
@endforeach
@endforeach
Цикл for
Аналогично PHP, Blade умеет работать с простейшим циклом "for", у которого задан шаг, минимальное и максимальное значение:
@for ($i = 0; $i < 10; $i++)
текущее значение переменной: {{ $i }}
@endforeach
Цикл forelse
Такой код будет выводить пару ключ-значение только если значение больше нуля. А с помощью такого кода можно выводить значение только есть массив не является пустым:
@if ( count($ar) )
@foreach ($ar as $el)
<div>{{ $el }}</div>
@endforeach
@else
<div>Массив пустой!</div>
@endif
Благодаря шаблонизатору Blade можно переписать этот код более компактно с помощью "
@forelse", при этом не потеряв логики (код будет делать то же самое):
@forelse ($ar as $el)
<div>{{ $el }}</div>
@empty
<div>Массив пустой!</div>
@endforelse
"forelse" выполняет цикл только в том случае, если обходимый массив не является пустым. Если же он пустой, то выполняется директива "
@empty", которая ставится после него.
Операции внутри цикла
Как и язык программирования PHP, шаблонизатор Blade умеет распознавать различные операции внутри цикла. К примеру, аналоги этих операций: "
@break" (прерывает цикл) и "
@continue" (приступает к следующей итерации цикла). Продемонстрируем их работу:
@foreach ($ar as $key => $el)
@if ($el == 5)
<div>Ключ: {{ $key }}, значение: {{ $el }}</div>
<div>Прерываем цикл!</div>
@break
@endif
@if ($el > 10)
<div>Переходим к следующей итерации!</div>
@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