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

Twig 我可以将关联数组提取到变量中吗?,twig,Twig,假设我有这样一个关联数组: {% set settings = { 'foo':'bar', 'cat':'mouse', 'apple':'banana' } %} 要使用此数据,我将执行以下操作: {{ settings.foo }} {{ settings.cat }} {{ settings.apple }} 但是,我想知道是否有一种方法可以提取变量的键,以及值到值的值?本质上与函数相同。所以我可以这样做: {{ foo }} {{ cat }} {{ apple }} 我非常业

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

{% set settings = { 'foo':'bar', 'cat':'mouse', 'apple':'banana' } %}
要使用此数据,我将执行以下操作:

{{ settings.foo }}
{{ settings.cat }}
{{ settings.apple }}
但是,我想知道是否有一种方法可以提取变量的键,以及值到值的值?本质上与函数相同。所以我可以这样做:

{{ foo }}
{{ cat }}
{{ apple }} 
我非常业余的尝试是这样开始的:

{% for key,val in settings %}
  {% set key = val %}
{% endfor %}
但很明显,这是行不通的(否则我就不在这里了)。我还有别的办法吗

谢谢


标记为细枝中的大多数内容这可以通过扩展细枝来完成

ProjectTwigExtension.php

在细枝上注册类

小枝


(旁注)使用闭包(参见下面的示例)似乎无法做到这一点,因为
Twig
的编译器在数组中传递变量,从而创建一个副本

结束

编译结果


与Twig中的大多数内容一样,这可以通过扩展Twig来完成

ProjectTwigExtension.php

在细枝上注册类

小枝


(旁注)使用闭包(参见下面的示例)似乎无法做到这一点,因为
Twig
的编译器在数组中传递变量,从而创建一个副本

结束

编译结果


感谢您的深入解决方案DarkBee。我从来没想到它会如此复杂,但它确实有效。我正在与Craft CMS合作,所以你提到的旁注最终不适用于我。再次感谢,非常高兴!抢手货它将替换现有变量吗?例如,上下文中已经定义了foo?还是给一个错误?仅出于好奇…当前代码将覆盖上下文中的任何现有变量谢谢深入的解决方案DarkBee。我从来没想到它会如此复杂,但它确实有效。我正在与Craft CMS合作,所以你提到的旁注最终不适用于我。再次感谢,非常高兴!抢手货它将替换现有变量吗?例如,上下文中已经定义了foo?还是给一个错误?仅出于好奇…当前代码将覆盖上下文中的任何现有变量
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 = new Twig_Environment($loader);
$twig->addExtension(new ProjectTwigExtension());
{{ extract({'foo': 'bar', }) }}
{{ foo }} {# output : bar #}
$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);