Циклы в шаблонизаторе Blade в Laravel

Шаблонизатора 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

Была ли эта статья полезна? Есть вопрос?

Закажите недорогой хостинг Заказать

всего от 290 руб

PHP альтернативный синтаксис управляющих конструкций

  • if
  • switch
  • while
  • for
  • Дополнительные сведения

PHP поддерживает альтернативный синтаксис для некоторых управляющих конструкций, а именно для:

if, switch, while, for и foreach. Основная форма альтернативного синтаксиса заключается в замене открывающей фигурной скобки на двоеточие (:), завершающая фигурная скобка заменяется на ключевое слово endif, endswitch, endwhile, endfor и endforeach, которое соответствует используемой конструкции.

if

При использовании в управляющих конструкциях альтернативного синтаксиса, фигурные скобки не ставятся, даже если используется несколько инструкций. После условия ставится двоеточие, после которого указывается одна или более инструкций, в самом конце, для указания завершения общей конструкции используется ключевое слово

endif.


<?php
  
  $a = 4;
  $b = 3;
  
  if ($a > $b): 
    echo $a . " больше";  
    echo ", чем " . $b;   
  elseif ($a == $b):       // Обратите внимание, здесь elseif записан в одно слово.
    echo $a." равно ".$b;
  else:
    echo $a." меньше ".$b;
  endif;

?>

Замечание: если для определения нескольких условий if/elseif используется альтернативный синтаксис, в этом случае можно использовать только elseif в одно слово, т. е. вы не должны разделять

else if в два слова, так как это вызовет фатальную ошибку в PHP.


<?php

  /* Этот код вызовет ошибку: */
  if ($a > $b):
    echo $a." больше, чем ".$b;
  else if ($a == $b):
    echo $a." равно ".$b;
  endif;

?>

Смешивание двух видов синтаксиса в одной конструкции не поддерживается, это правило относится ко всем операторам указанных в этой главе.


<?php

  /*Этот код не будет работать*/
  if($a > $b): 
    echo $a . " больше";  
    echo ", чем " . $b;   
  elseif ($a == $b) {  // нельзя смешивать два вида записей в одной конструкции
    echo $a." равно ".$b;
  }
  else:
    echo $a." меньше ".$b;
  endif;

?>

Правила альтернативного синтаксиса описанные в этом разделе также действуют и для остальных управляющих структур. Поэтому ниже будут просто приведены примеры.

switch


<?php

  $num = 2;
  switch ($num):
    case 0:
      echo "\$num равно 0";
      break;
    case 1:
      echo "\$num равно 1";
      break;
    case 2:
      echo "\$num равно 2";
      break;
    default:
      echo "\$num не равно 0, 1 или 2";
  endswitch;
   
?>

while


<?php

  $num = 5;
  while ($num--):
    echo "$num<br>";
  endwhile;

?>

for


<?php

  for ($k = 1; $k <= 10; $k++):
    echo "$k ";
  endfor;
   

  // пример с вложенным циклом
  for ($i = 0; $i < 4; $i++):
    echo "Внешний цикл. <br>";
    for ($j = 0; $j < 2; $j++):
      echo "Вложенный цикл.<br>";
	endfor;  //вложенные конструкции тоже надо завершать ключевым словом
  endfor;
   
?>

Обратите внимание, для вложенных конструкций, может применяться и синтаксис включающий фигурные скобки, но так делать не рекомендуется, так как это снижает читаемость кода.


<?php

  for ($i = 0; $i < 4; $i++):
    echo "Внешний цикл.<br>";
    for ($j = 0; $j < 2; $j++) {
      echo "Вложенный цикл.<br>";
    }
  endfor;
   
?>

Дополнительные сведения

Теперь рассмотрим вопрос о том, когда лучше использовать альтернативный синтаксис, а заодно вы узнаете, как еще можно использовать управляющие конструкции.

Приведем простой пример:


<?php if ($a == 5): ?>
  <p>A равно 5</p>
<?php endif; ?>

В приведенном примере, блок HTML-кода "A равно 5" вложен внутрь конструкции if написанной с альтернативным синтаксисом. HTML-блок будет показан только в том случае, если переменная $a будет равна 5.

Как вы уже могли догадаться из примера выше, альтернативный синтаксис можно использовать для вставок в HTML-разметку. Так как в этом случае код php и html будут разделены, это упрощает верстку страницы.

Рассмотрим примеры для других конструкций:



  <ul>
    <!-- использование конструкции for-->
    <?php for ($items = 1; $items <= 10; $items++): ?>
      <li><?php echo $items ?></li>
    <?php endfor; ?>
  </ul>
  
  <ul>
    <!--тоже самое, но с использованием конструкции while-->
    <?php $items = 1; while ($items <= 10): ?>
      <li><?php echo $items ?></li>
    <?php $items++; endwhile; ?>
  </ul>
  
  <!--использование конструкции switch-->
  <?php switch ($item):
    case 1: ?>
      <p>Значение равно 1. </p>
      <?php break; ?>
    <?php default: ?>
      <p>Значение не известно.</p>
  <?php endswitch; ?>

Конечно не обязательно использовать представленный синтаксис, можно пользоваться и стандартной записью, с использованием фигурных скобок, но в этом случае код будет менее читабельным.


<?php if ($a == 5) { ?>
  <p>A равно 5</p>
<?php } else { ?>
  <p>A не равно 5</p>
<?php } ?>

Синтаксис оператора foreach и его альтернативная запись будут рассмотрены позднее, а именно во время изучения массивов и объектов.

С этой темой смотрят:

  • if else
  • switch
  • Цикл while (do while)
  • Цикл for

Альтернативная форма записи управляющих конструкций PHP

Blox CMS — система для разработки, сборки и управления сайтом

  • Главная
  • Документация
  1. Документация
  2. Для разработчика сайта
  3. Файлы шаблона
  4. Файл . tpl (шаблон)
  5. Выбор шаблонизатора: Smarty или PHP?
  6. PHP-шаблоны

Короткая форма записи открывающих тегов PHP

Для простоты сначала рассмотрим примеры с короткой формой записи открывающих тегов PHP.

Вставка редактируемого данного


<td><?= $dat[1] ?></td>

foreach

<? foreach ($tab as $i => $dat): ?>
    <?= $dat['edit']?>
    Фамилия <?= $dat[1] ?> упоминается <?= $tdat[$i] ?> раз.
<? endforeach ?>

Присваивание значения

<?
    $aa = 10;
    $bb = $aa + 5;
?>
<?= $bb ?>
// Данный пример выведет: 15

if…else

<? if ($dat['edit']): ?> вы можете редактировать этот блок
<? else: ?> вы не можете редактировать этот блок
<? endif ?>

Пример (полосатая таблица)
Это — пример, в котором используются все три конструкции. В нем цвет строк таблицы чередуется между белым (по умолчанию) и серым (#dddddd):


<? $toggle=1; ?>
<table>
<? foreach ($tab as $dat): ?>
# Если переменная $toggle положительна, то - серый фон
<tr<? if ($toggle>0): ?> bgcolor="#dddddd"<? endif ?>>
    <td><?= $dat['edit'] ?></td>
    <td><?= $dat[1] ?>     </td>
    <td><?= $dat[2] ?>     </td>
</tr>
<? $toggle=-$toggle ?>
<? endforeach ?>
</table>

Полная форма записи открывающих тегов PHP

В приведенных примерах применялась короткая форма записи открывающих тегов PHP: <? ... ?>.

Для того, чтобы работали короткие теги, они должны быть включены в настройках PHP (в файле php.ini должна присутствовать строка short_open_tag = On). В PHP4 короткие теги разрешены по умолчанию, в PHP5 — нет.

Если вы хотите использовать PHP в комбинации с XML (чтобы беспрепятственно использовать <?xml ?>) лучше отказаться от коротких открывающих тегов.

Полная форма немного длиннее: <?php ... ?>. По другому выглядит полная конструкция вывода на экран. Вместо <?= ... ?> нужно писать <?php echo ... ?>. С учетом этих замен последний пример будет выглядеть так:

Полная (не короткая) форма записи открывающих тегов PHP


    <?php $toggle=1; ?>
    <table>
    <?php foreach ($tab as $dat): ?>
    <tr<?php if ($toggle>0): ?> bgcolor="#dddddd"<?php endif ?>>
        <td><?php echo $dat['edit'] ?></td>
        <td><?php echo $dat[1] ?>     </td>
        <td><?php echo $dat[2] ?>     </td>
    </tr>
    <?php $toggle=-$toggle ?>
    <?php endforeach ?>
    </table>
    

Короткие теги удобно применять на стадии разработки. Готовая же работа должна быть выполнена обязательно с полной формой открывающих тегов. Для переделки коротких тегов в полную форму нет необходимости редактировать отдельно каждый тег — большинство редакторов кода позволяет делать одновременную замену во всех файлах шаблонов (обычно с помощью комбинации клавиш Ctrl+Shift+R). Замены нужно производить в три прохода:

Переход от короткой формы записи открывающих тегов к полной (без использования регулярных выражений)
Найти:Заменить на:
1.<?=<? echo
2.<?<?php
3.<?phpphp<?phpКонтрольный проход, т.к. где-то уже могла применяться полная форма

Примечания
  • Начиная с PHP 5. 4, для вывода можно вновь использовать короткий тег <?=, даже при выключенной опции short_open_tag.
  • PHP-код в альтернативном синтаксисе выполняется приблизительно на 30% быстрее, чем тот же код, записанный в основной форме, то есть, с помощью оператора echo.

 

   

  • PHP-шаблоны 
    • Альтернативная форма записи управляющих конструкций PHP
    • Основная форма записи php-кода в шаблонах 
  • Smarty-шаблоны

php — endforeach в циклах?

Спросил

Изменено 5 лет назад

Просмотрено 165k раз

Я использую скобки при использовании цикла foreach. Для чего нужен endforeach?

  • php
  • циклы
  • foreach
  • оператор if

0

Это в основном для того, чтобы вы могли сделать начальные и конечные операторы более четкими при создании HTML в циклах:

 <таблица>

    
        
        
            
        
        <тд>
        
        
            

Надеюсь, мой пример достаточен, чтобы продемонстрировать, что если у вас есть несколько уровней вложенных циклов, и отступы сбрасываются всеми открывающими/закрывающими тегами PHP и содержащимся HTML (и, возможно, вам нужно сделать отступ HTML определенным образом, чтобы получить свою страницу так, как вы хотите), форма с альтернативным синтаксисом ( endforeach ) может упростить анализ вашего мозга. В обычном стиле закрывающие } можно оставить сами по себе, что затруднит определение того, что они на самом деле закрывают.

4

Это оператор конца для альтернативного синтаксиса:

 foreach ($foo as $bar):
    ...
конец для каждого;
 

Полезно, чтобы сделать код более читаемым, если вы выходите из PHP:

 
    <разд...>
        ...
    

2

в качестве альтернативного синтаксиса вы можете писать циклы foreach следующим образом:

 foreach($arr as $item):
    //делаем что-то
конец для каждого;
 

Этот тип синтаксиса обычно используется, когда php используется как язык шаблонов как таковой

 
    

 

Это просто другой синтаксис. Вместо

 foreach ($a as $v) {
    # . ..
}
 

Вы можете написать так:

 foreach ($a as $v):
    # ...
конец для каждого;
 

Они будут работать точно так же; это просто вопрос стиля. (Лично я никогда не видел, чтобы кто-то использовал вторую форму.)

8

Как насчет этого?

 <ул>

    <ул>
    
        
  • Мы по-прежнему можем использовать более широко используемые фигурные скобки и, в то же время, повысить читабельность.

    Использование foreach: endforeach; не только делает вещи читабельными, но и снижает нагрузку на память, как указано в документации по PHP. Так что для больших приложений, получающих много пользователей, это будет лучшим решением

    Как насчет этого?

     ";
            foreach($items as $item){
                эхо "
  • $item
  • "; } эхо ""; } ?>

    1

    Твой ответ

    Зарегистрируйтесь или войдите

    Зарегистрироваться через Google

    Зарегистрироваться через Facebook

    Зарегистрируйтесь, используя электронную почту и пароль

    Опубликовать как гость

    Электронная почта

    Требуется, но не отображается

    Опубликовать как гость

    Электронная почта

    Требуется, но не отображается

    php — endforeach в цикле?

    Saya menggunakan tanda kurung saat menggunakan foreach loop. Untuk апа endforeach?

    phploopsforeachif-statement

    CyberJunkie

    Ini terutama agar Anda dapat membuat pernyataan awal dan akhir lebih lebih 900 loop2: 900 HTML saat membuat <тд>

    Mudah-mudahan contoh saya cupup untuk menunjukkan bahwa setelah Anda memiliki beberapa lapisan loop bersarang, dan indentasi dilemparkan oleh semua tag buka/tutup PHP dan HTML yang terkandung (dan mungkin Anda harus indentasi HTML tertentu cara Anda sepertiinang halamaning ), bentuk sintaks alternatif ( endforeach ) dapat membuat segalanya lebih mudah bagi otak Anda untuk menguraikan. Денган гая нормальный, пенутупан } Dapat dibiarkan sendiri dan membuatnya sulit untuk mengatakan apa yang sebenarnya mereka tutup.

    Брэд Мейс

    Самый удобный и надежный сервис для хранения файлов

    Получите личное облачное хранилище с

    2Гб места бесплатно как $бар) : … конец для каждого;

    Бергуна унтук мембуат коде лебих мудах дибака джика Анда келуар дари PHP:

     
        <разд...>
            ...