Pet*_*ter 13 php loops symfony twig
在PHP中,您可以从循环中断或继续下一次迭代.我想知道你是否在Symfony的Twig中拥有相同的功能.
例如,在PHP中,我能够:
foreach ($array as $key => $value) {
if ($value == 'something') {
continue;
} elseif ($value == 'somethingElse') {
break;
}
echo $value;
}
Run Code Online (Sandbox Code Playgroud)
Twig中有类似的东西吗?例如:
{% for value in array %}
{% if value == 'something' %}
{% continue %}
{% endif %}
{% if value == 'somethingElse' %}
{% break %}
{% endif %}
{{ value }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
Edg*_*oro 14
你可以做这样的事情,以模拟模式:
{% 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 %}
Run Code Online (Sandbox Code Playgroud)
只需将代码包装在条件内即可继续.
为了打破使用从for循环外部可见的变量.
我猜你也可以编写自己的自定义for循环.
我已经阅读了所有的答案,我同意他们的观点,但并不完全正确,所以我决定写下我的答案.
首先,正如@CristiC777在他的信息中指出的那样,如果你达到了你需要打破for的情况,那么在此之前你做错了.您可以解决此问题,只是限制查询或从阵列中取消设置数据.这是一个更好的解决方案,因为您将改善响应时间并节省服务器内存.
Twig的观点需要愚蠢.如果你将一堆条件和变量放入其中,你将只能使它们不可读且不可维护.
如果,由于某种原因,你不能改变以前的代码,正如@Edgar Alloro指出的那样,Twig允许你在for上设置条件(从1.2开始).您的示例将更改为以下内容:
{% set keepFor = true %}
{% for value in array if keepFor %}
{% if value != 'valueExpected' %}
{% keepFor = false %}
{% endif %}
{{ value }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
您也可以自己实施,特别是如果您没有Twig 1.2.如果您有Twig 1.2或更高版本,我不推荐这个,因为for会迭代整个数组,你会花更多的内存:
{% set keepFor = true %}
{% for value in array %}
{% if keepFor %}
{% if value != 'valueExpected' %}
{% keepFor = false %}
{% endif %}
{{ value }}
{% endif %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
首先 !
在准备数据控制器和发送只是您在树枝所需要的!
因为树枝是 视图,不建议使用大列表.想一想,当您加载查看许多您不使用的对象或实体时,您会发现自己处于这种情况.
因此,如果你仍然想要有一个艰难的生活使用Edgar Alloro解决方案与循环之前声明的变量.或者我知道这个迭代有LastIndex尝试设置当你想要制动循环..
玩得开心 !;)
根据文档,它不可能在循环中中断或继续.但是,您可以在迭代期间过滤序列,以便跳过项目.以下示例将跳过所有未处于活动状态的用户:
<ul>
{% for user in users if user.active %}
<li>{{ user.username }}</li>
{% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)
使用以下类创建一个TwigExtension:
AppBundle \ Twig \ AppExtension.php:
namespace AppBundle\Twig;
class AppExtension extends \Twig_Extension
{
function getTokenParsers() {
return array(
new BreakToken(),
);
}
public function getName()
{
return 'app_extension';
}
}
Run Code Online (Sandbox Code Playgroud)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';
}
}
Run Code Online (Sandbox Code Playgroud)AppBundle \ Twig \ BreakNode.php:
namespace AppBundle\Twig;
class BreakNode extends \Twig_Node
{
public function compile(\Twig_Compiler $compiler)
{
$compiler
->write("break;\n")
;
}
}
Run Code Online (Sandbox Code Playgroud)然后,您可以简单地使用{% break %}来摆脱这种循环:
{% set var = ['foo', 'bar'] %}
{% for v in var %}
{{ v }}
{% break %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
我没有足够的时间编写代码,但是您可以用continue相同的方式编写代码块。
要走得更远,您可以像处理PHP中那样处理{% continue X %}并{% break X %}退出/继续多个循环。
如果有人要分享它,请随时编辑我的答案。