Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何停止或打破从树枝环自由?_Php_Symfony_Loops_Twig - Fatal编程技术网

Php 如何停止或打破从树枝环自由?

Php 如何停止或打破从树枝环自由?,php,symfony,loops,twig,Php,Symfony,Loops,Twig,在PHP中,您可以中断循环或继续下一次迭代。我想知道你在Symfony的小树枝上是否有同样的功能 例如,在PHP中,我能够做到: foreach ($array as $key => $value) { if ($value == 'something') { continue; } elseif ($value == 'somethingElse') { break; } echo $value; } 树枝上有类似的东西吗

在PHP中,您可以中断循环或继续下一次迭代。我想知道你在Symfony的小树枝上是否有同样的功能

例如,在PHP中,我能够做到:

foreach ($array as $key => $value) {
    if ($value == 'something') {
        continue;
    } elseif ($value == 'somethingElse') {
        break;
    }
    echo $value;
}
树枝上有类似的东西吗?例如:

{% for value in array %}
    {% if value == 'something' %}
    {% continue %}
    {% endif %}
    {% if value == 'somethingElse' %}
    {% break %}
    {% endif %}
    {{ value }}
{% endfor %}

为了模拟模式,可以执行以下操作:

{% set breakLoop = false %}

{% for value in array if breakLoop == false %}
    {% if value == 'somethingElse' %}
        {% breakLoop = true %}
    {% endif %}

    {% if value != 'something' and breakLoop == false %}


        {{ value }}
    {% endif %}
{% endfor %}
只需将代码包装在条件中,即可不继续

对于中断,请使用从For循环外部可见的变量


我想,您也可以编写自己的自定义for循环。

首先
控制器中准备您的数据,然后在twig中发送所需的数据
因为twig是视图,不建议使用大型列表。想想看,当你在视图中加载很多你不使用的对象或实体时,你会发现自己处于这种情况

所以,如果您仍然想要过艰苦的生活,请使用Edgar Alloro解决方案,在循环之前声明一个变量。或者我知道这个迭代有LastIndex,当您想要停止循环时,尝试设置它


玩得开心

根据文档,不可能在循环中中断或继续。但是,您可以在迭代期间过滤序列,从而允许您跳过项目。以下示例跳过所有未激活的用户:

<ul>
{% for user in users if user.active %}
    <li>{{ user.username }}</li>
{% endfor %}
</ul>
    {如果user.active%}
  • {{user.username}
  • {%endfor%}

我已经阅读了所有的答案,我同意它们,但并不完全正确,所以我决定也写我的答案

首先,正如@CristiC777在他的信息中指出的那样,如果你达到了需要打破a的情况,你在这一点之前做了错事。您可能只需对查询设置一个限制或从数组中取消设置数据,就可以解决这个问题。这是一个更好的解决方案,因为您将提高响应时间并节省服务器内存

细枝视图应该是愚蠢的。如果你在其中放入一堆条件和变量,你只会使它们变得不可读和不可管理

如果由于某种原因,您无法更改之前的代码,正如@Edgar Alloro所指出的,Twig允许您更改(从1.2开始)。您的示例将更改为以下内容:

{% set keepFor = true %}

{% for value in array if keepFor %}

    {% if value != 'valueExpected' %}

        {% keepFor = false %}

    {% endif %}

    {{ value }}

{% endfor %}
{% set var = ['foo', 'bar'] %}
{% for v in var %}
    {{ v }}
    {% break %}
{% endfor %}
您还可以自己实现,特别是在没有Twig1.2的情况下。如果您有Twig 1.2或更高版本,我不建议这样做,因为for将迭代整个数组,您将花费更多内存

{% set keepFor = true %}

{% for value in array %}

    {% if keepFor %}

        {% if value != 'valueExpected' %}

            {% keepFor = false %}

        {% endif %}

        {{ value }}

    {% endif %}

{% endfor %}
使用以下类创建一个应用程序:

  • AppBundle\Twig\AppExtension.php:

    namespace AppBundle\Twig;
    
    class AppExtension extends \Twig_Extension
    {
        function getTokenParsers() {
            return array(
                new BreakToken(),
            );
        }
    
        public function getName()
        {
            return 'app_extension';
        }
    }
    
  • AppBundle\Twig\BreakToken.php:

    namespace AppBundle\Twig;
    
    class BreakToken extends \Twig_TokenParser
    {
        public function parse(\Twig_Token $token)
        {
            $stream = $this->parser->getStream();
            $stream->expect(\Twig_Token::BLOCK_END_TYPE);
    
            // Trick to check if we are currently in a loop.
            $currentForLoop = 0;
            try { // This "try" is because look() will throws a PHP exception if $this->current - $i is negative (where $this is $stream).
                for ($i = 1; true; $i++) {
                    $token = $stream->look(-$i);
                    if ($token->test(\Twig_Token::NAME_TYPE, 'for')) {
                        $currentForLoop++;
                    } else if ($token->test(\Twig_Token::NAME_TYPE, 'endfor')) {
                        $currentForLoop--;
                    }
                }
            } catch (\Exception $e) {
            }
    
            if ($currentForLoop < 1) {
                throw new \Twig_Error_Syntax('Break tag is only allowed in \'for\' loops.', $stream->getCurrent()->getLine(), $stream->getSourceContext()->getName());
            }
    
            return new BreakNode();
        }
    
        public function getTag()
        {
            return 'break';
        }
    }
    
然后,您只需使用
{%break%}
即可摆脱如下循环:

{% set keepFor = true %}

{% for value in array if keepFor %}

    {% if value != 'valueExpected' %}

        {% keepFor = false %}

    {% endif %}

    {{ value }}

{% endfor %}
{% set var = ['foo', 'bar'] %}
{% for v in var %}
    {{ v }}
    {% break %}
{% endfor %}

我没有足够的时间编写代码,但是您可以用同样的方法编写
continue

更进一步,您可以处理
{%continue X%}
{%break X%}
以获得/继续PHP中的多个循环


如果有人想这样做并分享,请随意编辑我的答案。

与PHP不同,循环中不可能中断或继续。但是,您可以在迭代过程中过滤序列,允许您跳过项目。以下示例跳过所有未激活的用户:是的-但是你可以用过滤器来模拟一个中断。我使用Angular.JS的可能副本!看这里如何:我想给CristiC777更多的投票。Twig是一种简单的模板语言,它是关于表示的。如果你不能在Twig中做些什么,你可能有一些古怪的逻辑需要重写。如果您必须“处理”数据,那么使用嵌入式控制器()能解决您的问题吗?也就是说,您不必担心页面上的逻辑,而是在控制器环境中按预期获取/解析数据集?这是正确的答案,无需添加新的语言结构。我希望没有人使用Twig 1.2,1.20中有大量的安全补丁。如果您知道Symfony 2.0甚至Symfony 1中还有多少项目,您会感到惊讶。*这太棒了!非常感谢。
{% set break = false %}

{% for value in array  if not break  %}
    {% if value == 'something' %}
    {% continue %}
    {% endif %}
    {% if value == 'somethingElse' %}
    {% set break = true %}
    {% endif %}
    {{ value }}
{% endfor %}