【问题标题】:"While" and "repeat" loops in TwigTwig 中的“While”和“repeat”循环
【发布时间】:2014-12-29 15:32:40
【问题描述】:

在 Twig 中是否有任何使用 while 和 repeat 循环的好方法?这是一个如此简单的任务,但没有宏我找不到任何好的和简单的东西。

至少做一个无限循环,然后在一个条件下打破它?

编辑:

我的意思是像

do {
    // loop code
} while (condition)

while (condition) {
    // loop code
}

编辑 2:

twig 本身似乎不支持它,原因与 continue;break; 语句都不支持。

https://github.com/twigphp/Twig/issues/654

【问题讨论】:

  • Twig 中有 forforeach 语句,还有 if 条件,但您的问题到底是什么?
  • 添加了一些我正在寻找的示例。
  • #Aistis 我面临同样的问题...需要使用 while(condition){ }... 但似乎它在 TWIG 中不可用。但是你说宏可能是一种方法。你能分享更多关于它的信息吗,因为到目前为止我从未在 symfony 中使用过宏。

标签: php symfony loops twig cycle


【解决方案1】:

您可以使用足够高的循环限制(10000?)使用for ... in ... if 模拟它

PHP:

$precondition = true;
while ($precondition) {
    $precondition = false;
}

树枝:

{% set precondition = true %}
{% for i in 0..10000 if precondition %}
    {% set precondition = false %}
{% endfor %}

同时做

PHP:

do {
    $condition = false;
} while ($condition) 

树枝:

{% set condition = true %} {# you still need this to enter the loop#}
{% for i in 0..10000 if condition %}
    {% set condition = false %}
{% endfor %}

【讨论】:

    【解决方案2】:

    简而言之:没有。此功能意味着高级逻辑,它应该在您的业务逻辑中,而不是在模板层中。这是 MVC 中关注点分离的一个典型例子。

    Twig 完全支持for-loops,如果你的代码正确的话就足够了——在它们所属的业务逻辑中对要显示的数据进行复杂的条件决策,然后将结果数组“准备好渲染”传递给模板。然后,Twig 支持渲染所需的所有不错的功能。

    【讨论】:

    • 问题是我需要打印一个嵌套数组。有一个条件,它必须不是递归地打印,而是迭代地。我不确定它是否真的如此高级的逻辑,应该在后端进行预处理。
    • 您既不需要do 也不需要while 来处理Twig 中的嵌套数组。您想要做的事情可能很容易用一个简单的宏来完成。使这个问题成为一个明显的XY problem 虽然 - 您询问了您的预期解决方案,而不是您要解决的真正问题。现在你让我和我们其他人只是猜测你真正想要实现的目标。
    • 感谢 Niels 的关注,但 我很感兴趣 Twig 真的没有 dowhile 的实现。通过上面的评论,我只想指出,在某些情况下,这些类型的周期可能是一个聪明的选择。我不是在寻找我的特定问题的答案。对不起,如果我们互相误解了。
    • 嗯,这部分在我回答的前四个字中得到了回答;) Twig 不支持其设计者认为模板引擎“超出范围”的功能,其中包括这些高级循环结构.它仅支持 for 循环 - 尽管与范围结构等结合使用时非常强大。
    • 关于带中断的循环的一些额外想法。 github.com/twigphp/Twig/issues/654
    【解决方案3】:

    我能够在 twig 中实现一个简单的 for 循环。所以下面的php语句:

    for ($x = 0; $x <= 10; $x++) {
        echo "The number is: $x <br>";
    }
    

    翻译成树枝时是:

    {% for i in 0..10 %}
        * {{ i }}
    {% endfor %}
    

    这不是一个 while 循环,而是一个潜在的解决方法。最好的建议是将这样的业务逻辑排除在模板层之外。

    【讨论】:

    • 抱歉,我看不出它是如何替代条件循环的。
    • 你的代码是干什么用的 ($x = 0; $x
    【解决方案4】:

    这是可能的,但有点复杂。

    您可以使用{% include ... %} 来处理嵌套数组,这从我阅读的 cmets 中是您需要做的。

    考虑以下代码:

    nested_array_display.html

    <ul>
    {% for key, val in arr %}
        <li>
            {{ key }}:
    {% if val is iterable %}
    {% include 'nested_array_display.html' %}
    {% else %}
            {{ val }}
    {% endif %}
        </li>
    {% endfor %}
    </ul>
    

    【讨论】:

      猜你喜欢
      • 2015-01-15
      • 1970-01-01
      • 2018-11-23
      • 2014-11-02
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      相关资源
      最近更新 更多