2016-09-27 37 views
0

可以說我有一個關聯數組,像這樣:我可以將關聯數組提取到變量中嗎?

{% 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 %} 

但顯然不工作(或者我就不會在這裏) 。我可以採取另一種方法嗎?

感謝,

馬克

回答

2

如桂枝大多數的事情,這可以通過在嫩枝

延伸 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 = 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); 
+0

謝謝深入的解決方案DarkBee。我從來沒有想到會像這樣令人費解,但它確實有效。我正在與Craft CMS合作,所以你提到的旁註最終並不適用於我。再次感謝,非常高興! –

+0

好趕上!它會取代現有的變量?例如foo已經在上下文中定義了嗎?或者給出錯誤?僅用於好奇... – Matteo

+0

當前代碼將覆蓋上下文中的任何現有變量 – DarkBee

相關問題