如何在Twig模板中使用中断或在for循环内继续?

2022-08-30 07:18:46

我尝试使用一个简单的循环,在我的实际代码中,这个循环更复杂,我需要这样的迭代:break

{% for post in posts %}
    {% if post.id == 10 %}
        {# break #}
    {% endif %}
    <h2>{{ post.heading }}</h2>
{% endfor %}

如何在 Twig 中使用 PHP 控件结构的行为或控件结构的行为?breakcontinue


答案 1

几乎可以通过设置一个新变量作为迭代的标志来完成:break

{% set break = false %}
{% for post in posts if not break %}
    <h2>{{ post.heading }}</h2>
    {% if post.id == 10 %}
        {% set break = true %}
    {% endif %}
{% endfor %}

一个更丑陋,但工作的例子:continue

{% set continue = false %}
{% for post in posts %}
    {% if post.id == 10 %}
        {% set continue = true %}
    {% endif %}
    {% if not continue %}
        <h2>{{ post.heading }}</h2>
    {% endif %}
    {% if continue %}
        {% set continue = false %}
    {% endif %}
{% endfor %}

但是没有性能利润,只有与内置和语句类似的行为,如扁平PHP。breakcontinue


答案 2

来自文档 TWIG 2.x 文档

与PHP不同,它不可能在循环中中断或继续。

但仍然:

但是,您可以在迭代期间筛选序列,从而可以跳过项。

示例 1(对于大型列表,您可以使用切片过滤帖子):slice(start, length)

{% for post in posts|slice(0,10) %}
    <h2>{{ post.heading }}</h2>
{% endfor %}

示例 2 也适用于 TWIG 3.0:

{% for post in posts if post.id < 10 %}
    <h2>{{ post.heading }}</h2>
{% endfor %}

您甚至可以将自己的TWIG过滤器用于更复杂的条件,例如:

{% for post in posts|onlySuperPosts %}
    <h2>{{ post.heading }}</h2>
{% endfor %}

推荐