我可以将关联数组提取到变量中吗?

时间:2016-09-27 23:08:00

标签: twig

假设我有一个像这样的关联数组:

{% set settings = { 'foo':'bar', 'cat':'mouse', 'apple':'banana' } %}

要使用此数据,我会执行以下操作:

{{ settings.foo }}
{{ settings.cat }}
{{ settings.apple }}

但是,我想知道是否有办法将键提取到变量,值是否值?基本上与PHP Extract函数相同。所以我可以这样做:

{{ foo }}
{{ cat }}
{{ apple }} 

我这非常业余的尝试就是这样开始的:

{% for key,val in settings %}
  {% set key = val %}
{% endfor %}

但显然这不起作用(或者我不会在这里)。我可以采取另一种方法吗?

谢谢,

标记

1 个答案:

答案 0 :(得分:3)

正如Twig中的大多数事情一样,这可以通过扩展Twig

来完成

ProjectTwigExtension.php

class ProjectTwigExtension extends Twig_Extension {

    public function getFunctions() {
        return array(
            new Twig_SimpleFunction('extract', array($this, 'extract'), ['needs_context' => true, ]),
        );
    }

    public function extract(&$context, $value) {
        foreach($value as $k => $v) $context[$k] = $v;
    }       

    public function getName() {
        return 'ProjectTwigExtension';
    }        
}

在Twig中注册课程

$twig = new Twig_Environment($loader);
$twig->addExtension(new ProjectTwigExtension());

template.twig

{{ extract({'foo': 'bar', }) }}
{{ foo }} {# output : bar #}

(旁注)似乎你不能通过使用闭包(参见下面的例子)来做到这一点,因为Twig的编译器传递了数组中的变量,从而创建了一个复制

关闭

$twig->addFunction(new Twig_SimpleFunction('extract',   function (&$context, $value) {
    foreach($value as $k => $v) $context[$k] = $v;
}, ['needs_context' => true, ]));

编译结果

echo twig_escape_filter($this->env, call_user_func_array($this->env->getFunction('extract')->getCallable(), array($context, array("foo" => "bar", "foobar" => "foo"))), "html", null, true);