Русскоязычная документация по Twig - PHP шаблонизатору. Руководство по Твиг на русском языке
Цикл for осуществляет перебор последовательности. Например, выведем список пользователей users:
<h1>Members</h1>
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% endfor %}
</ul>
Последовательность может быть массивом или объектом, реализующим Traversable интерфейс.
Если цикл проходит по массиву чисел, можно использовать оператор .. :
{% for i in 0..10 %}
* {{ i }}
{% endfor %}
Приведенный выше фрагмент кода выводит все числа от 0 до 10. Также оператор .. может быть полезен при работе с буквами:
{% for letter in 'a'..'z' %}
* {{ letter }}
{% endfor %}
The .. operator can take any expression at both sides:
{% for letter in 'a'|upper..'z'|upper %}
* {{ letter }}
{% endfor %}
loop.index | Текущая итерация цикла (начиная от 1) |
---|---|
loop.index0 | Текущая итерация цикла (начиная от 0) |
loop.revindex | Количество интераций с конца цикла (начиная от 1) |
loop.revindex0 | Количество интераций с конца цикла (начиная от 0) |
loop.first | выставляется в True если текущая итерация является первой |
loop.last | выставляется в True если текущая итерация является последней |
loop.length | Количество элементов в последовательности |
loop.parent | Родительский контекст |
{% for user in users %}
{{ loop.index }} - {{ user.username }}
{% endfor %}
Переменные цикла loop.length, loop.revindex, loop.revindex0, and loop.last могут быть использованы только при работе с PHP массивами или объектами, реализующими Countable интерфейс (т.е. интерфейс возвращающий значение фукнции count - количество элементов в массиве или количество свойств объекта). Данные переменные недоступны, если цикл содержит условия.
В отличие от PHP, в данном случае нельзя прервать или продолжить цикл. Однако можно создавать правила прохождения последовательностей во время итераций, позволяющие пропускать или отбирать элементы по установленным критериям. В примере ниже неактивные пользователи пропускаются:
<ul>
{% for user in users if user.active %}
<li>{{ user.username|e }}</li>
{% endfor %}
</ul>
Преимущество состоит в том, что переменная цикла будет считать корректно. Keep in mind that properties like loop.last will not be defined when using loop conditions.
Использовать переменную цикла одновременно с условиями не рекомендуется, поскольку вы получите не тот результат, который ожидаете. Например, добавление условия loop.index > 4 работать не будет, поскольку индекс увеличивается только в том случае, если условие истинно.
Если итерация не состоялась из-за того, что последовательность была пуста, вы можете осуществить замену/подстановку блока, используя оператор else:
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% else %}
<li><em>no user found</em></li>
{% endfor %}
</ul>
По умолчанию, цикл проходит по всем значениям последовательности. С помощью фильтра keys можно организовать перебор ключей массива:
<h1>Members</h1>
<ul>
{% for key in users|keys %}
<li>{{ key }}</li>
{% endfor %}
</ul>
Также вы можете вывести ключи и значеня одновременно
<h1>Members</h1>
<ul>
{% for key, user in users %}
<li>{{ key }}: {{ user.username|e }}</li>
{% endfor %}
</ul>
При необходимости перебрать подмножество значений/определенную часть элементов множества, можно использовать фильтр slice:
Вы также можете организовать цикл, который переберет ключи массива по определенным параметрам/свойствам:
<h1>Top Ten Members</h1>
<ul>
{% for user in users|slice(0, 10) %}
<li>{{ user.username|e }}</li>
{% endfor %}
</ul>