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

106

在 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
4
您可以使用 "attribute" 函数:http://twig.sensiolabs.org/doc/functions/attribute.html{% if attribute(array, key) is defined %} // 做某些事情 {% endif %} - Dennais
@Vega,你应该将其添加为答案,因为这似乎是检查不是单词的键(例如data-value)的唯一方法。 - insertusernamehere
4个回答

239

Twig示例:

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

2
为什么我们不能只使用 {% if array.key %}?它有什么问题吗?在JS中,这是完全有效的语句,但在Twig中不是! - Dmitry
3
{% if array.key %} 是有效的语法,但它用来检查数组的键是否为空。twig.sensiolabs.org/doc/tags/if.html#if - bats-everywhere
30
如果“key”是一个变量,您需要使用“{% if array[key] %}”或“{% if array[key] is defined %}”。而“array.key”会尝试访问数组中的索引“key”。 - MarthyM

41
你可以使用Twig函数keys

{% if myVar in someOtherArray|keys %}


1
这对我来说完成了工作,谢谢! - Marcky
5
如果在循环中使用这种方法是不好的……还有更好的解决方案,比如使用'is defined',例如:{% if someOtherArray[myVar] is defined %} - Steve Childs
2
这在键不适合机器的情况下效果更好。例如,array['not-friendly']。 - burntblark
1
如果您正在使用动态键名,那么这个答案是最好的。 - maverabil

4

快速回答(TL;DR)

  • DeveloperTLindel想要在Twig中测试数组键的存在。
  • DeveloperTLindel希望捕获与未定义键相关的任何错误。
  • 可以使用default过滤器处理此问题。

详细回答

上下文

  • Twig 2.x(截至2017年3月8日最新版本)
  • 通用的default过滤器使用。

问题

  • 情境:
  • DeveloperTLindel想要在Twig中测试数组键的存在。
  • DeveloperTLindel希望避免由于潜在未定义键而导致的任何错误或异常。

解决方案

  • DeveloperTLindel可以使用default过滤器。
  • default过滤器捕获由于未定义变量而引起的任何异常,并允许短路替换为替代值。
  • default过滤器是可链接的。

示例01

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

另请参阅


1

SYMFONY 6

解决方案非常简单,TWIG在控制器中调用$this->render时正在寻找传递的变量。

  1. 创建您的数据包,如下所示:

                 $options = [
                     'companyLogo' => $company->getCompanyLogoLink(),
                     'companyName' => $company->getCompanyShortname(),
                     'menuItem'    => $companyMenuCategories,
             ];
    
  2. 将其传递给TWIG

    return $this->render('folder/template.html.twig', [ 'o' => $options, ]);

  3. 在twig中查找“passed”关键字(o)及其相关数组数据

       {% if o.companyName is defined %}
         {{ o.companyName }}
       {% endif %}
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接