在Twig中,检查数组的特定键是否存在


76

在PHP中,我们可以使用函数检查数组中是否存在键array_key_exists()

在Twig模板语言中,我们可以简单地使用一条if语句来检查变量或对象的属性是否存在,如下所示:

{% if app.user %}
do something here
{% else %}
do something else
{% endif %}

但是,我们如何使用Twig检查数组的键是否存在?我试过了{% if array.key %},但是给了我一个错误:

Key "key" for array with keys "0, 1, 2, 3...648" does not exist

由于将数据传递到模板的主要方法之一是使用数组,因此似乎应该有某种方法可以做到这一点。有什么想法吗?


Twig只是一个模板引擎。你知道吗
itachi 2012年

3
您可以使用“属性”功能:twig.sensiolabs.org/doc/functions/attribute.html {%,如果定义了attribute(array,key)%} //做点{%endif%}
Dennais 2015年

@Vega您应该添加它作为答案,因为这似乎是检查不是单个单词的键(如)的唯一方法data-value
此处插入用户名,2015年

Answers:


180

树枝示例:

{% if array.key is defined %}
  // do something
{% else %}
  // do something else
{% endif %}

2
我们为什么不能只使用{% if array.key %}呢?它出什么问题了?在JS中,这是完全有效的语句,但在Twig中则不是!
dVaffection

3
{% if array.key %}是有效的,但它是检查数组键是否为空的语法。twig.sensiolabs.org/doc/tags/if.html#if
array-pop-tarts

18
如果key是变量,则需要使用{% if array[ key ] %}{% if array[ key ] is defined %}array.key尝试访问数组中的索引“键”。
MarthyM '16

24

您可以使用keys树枝功能

{% if myVar in someOtherArray|keys %}


1
ty,这为我做了工作!
Marcky

2
如果在循环中使用,这是不好的。。。还有更好的答案,例如使用“已定义”。例如{%如果someOtherArray [myVar]被定义%}
史蒂夫·查尔斯

在密钥对机器不友好的情况下,这样做效果更好。例如,array ['not-friendly']
burntblark

3

快速解答(TL; DR)

  • DeveloperTLindel希望测试Twig中是否存在数组键。
  • DeveloperTLindel希望捕获与未定义键相关的所有错误。
  • 可以使用default过滤器进行处理。

详细答案

语境

  • Twig 2.x(最新版本自2017年3月3日起)
  • default过滤器的通用用途。

问题

  • 场景:
  • DeveloperTLindel希望测试Twig中是否存在数组键。
  • DeveloperTLindel希望避免由可能未定义的键引起的任何错误或异常。

  • DeveloperTLindel可以使用default过滤器。
  • default过滤器捕捉由于未定义的变量的任何异常,并允许替代值的短路substition。
  • default过滤器可链接。

范例01

{#-********************************************
  测试关联数组中的单个键
  -#} 
  {%-set mystring = myarray ['key-no-existo'] | default('__ BLANK__')-%}

{#-********************************************
  测试关联数组中的多个键
  -#} 
  {%-set mystring = myarray ['alpha']
        | default(myarray ['bravo'])
        | default(myarray ['charlie'])
        | default('__ BLANK__')
        -%}

也可以看看

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.