从Twig设置数组的元素


Setting element of array from Twig

如何从Twig设置现有数组的成员?

我试着用下一种方法:

{% set arr['element'] = 'value' %}

但我得到了以下错误:

值"["("语句块末尾")的意外标记"标点符号"预期)。。。

在Twig中没有很好的方法可以做到这一点。然而,这是可能的,通过使用合并过滤器:

{% set arr = arr|merge({'element': 'value'}) %}

如果element是一个变量,请用括号括起来:

{% set arr = arr|merge({(element): 'value'}) %}

我遇到了这个问题,但我试图创建整数索引,而不是像"element"这样的关联索引。

您需要使用合并过滤器保护()的索引密钥:

{% set arr = arr|merge({ (loop.index0): 'value'}) %} 

您现在可以添加自定义索引键,如('element'~loop.index0)

如果初始化只需要:

{% set items = { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'unknown' } %}

我尝试过@LivaX的答案,但它不起作用,合并键为数字的数组也不起作用(https://github.com/twigphp/Twig/issues/789)。

只有当密钥是字符串时,这才会起作用

我所做的是从初始数组(t)中重新创建另一个数组(temp),并使键成为字符串,例如:

{% for key , value in t%}
{% set temp= temp|merge({(key~'_'):value}) %}
{% endfor %}

t键:0、1、2。。

temp键:0_、1_、2_。。。。

您还可以使用以下语法:

{% set myArray = myArray + myArray2 %}
{% set links = {} %}
{# Use our array to wrap up our links. #}
{% for item in items %}
  {% set links = links|merge({ (loop.index0) : {'url': item.content['#url'].getUri(), 'text': item.content['#title']} }) %}
{% endfor %}
{%
set linkList = {
  'title': label,
  'links': links
}
%}
{% include '<to twig file>/link-list.twig'%}

感谢这个线程——我还能够用(loop.index0)创建一个数组并发送到trick。

我发现这个问题很烦人,我的解决方案可能是正统的,不符合Twig的哲学,但我开发了以下内容:

$function = new Twig_Function('set_element', function ($data, $key, $value) {
    // Assign value to $data[$key]
    if (!is_array($data)) {
        return $data;
    }
    $data[$key] = $value;
    return $data;
});
$twig->addFunction($function);

可以如下使用:

{%set arr=set_element(arr,'element','value')%}

只需像{% set arr={'key':'value'} %}一样使用它(:后面没有空格),它就可以很好地工作。

但当我在for循环中使用它时,为了使它成为一个数组,它在for范围之外不起作用。

{% for group in user.groups %}
  {% set foo={'loop.index0':'group.id'} %}
  {% set title={'loop.index0':'group.title'} %}
  {{ title }} //it work 
{% else %}
  {% set foo={'0':'-1'} %}
  {% set title={'0':'未分组'} %}
{% endfor %}
{{ title }}  //it does not work, saying title is not defined

添加我的答案,以防在merge不起作用时有人需要更新数组,因为它只是附加到数组的末尾,而不是提供更改现有值的能力。

假设您有一个数组words_array,如下所示:

Object {
 0: "First word"
 1: "Second word"
 2: "Third word"
}

为了更新"Second word",您可以执行以下操作:

{% set words_array = {(1): 'New word'} + words_array %}

得到的阵列将是:

Object {
 0: "First word"
 1: "New word"
 2: "Third word"
}

如果使用循环并使用loop.index0变量,则可以更进一步,如下所示:

{% for word in words_array %}
  {% if word == 'Second word' %}
    {% set words_array = {(loop.index0): 'New word'} + words_array %}
  {% endif %}
{% endfor %}

我有一个多维数组。我能找到的唯一解决方案是创建一个新的临时数组,并更新/添加信息,这些信息被进一步传递给另一个trick函数。

我以前遇到过这个问题。想象一下,你有一个像这样的数组:

data = {
    'user': 'admin',
    'password': 'admin1234',
    'role': 'admin',
    'group': 'root',
    'profile': 'admin',
    'control': 'all',
    'level': 1,
    'session': '#DFSFASADASD02',
    'pre_oa': 'PRE-OA',
    'hepa_oa': 'HEPA-OA',
    'pre_ra': 'HEPA-RA',
    'hepa_ra': 'HEPA-RA',
    'deodor_ra': 'DEODOR-RA'
}

因此,您希望在两行中显示这些数据,但从该列表中删除密码。为此,使用slice滤波器可以很容易地拆分为2个阵列。但是,我们必须删除密码。出于这个原因,我使用了这个片段。其思想是将小于data元素大小除以2的所有元素放在一起。为了计算这一点,我们使用滤波器CCD_ 16。现在,为了获得当前元素的索引,我们使用loop.index。最后,我们在左或右数组中推一个关联元素。关联阵列具有两个分量CCD_ 18和CCD_。为了引用twit中的数组密钥,我们操作(),并使用merge滤波器推入数组,如图所示{% set left_list = left_list|merge({ (key): value }) %}

这就是完整的解决方案。

{% set left_list = {} %}
{% set right_list = {} %}
{% set limit = data|length // 2 %}
{% for key, value in data|cast_to_array %}
{% if key != 'password' %}
{% if loop.index <= limit %}
{% set left_list = left_list|merge({ (key): value }) %}
{% else %}
{% set right_list = right_list|merge({ (key): value }) %}
{% endif %}
{% endif %}
{% endfor %}
{% for key, value in left_list %}
<p>
<label for="{{key}}">{{key}}</label>
<input type="text" name="{{key}}" id="{{key}}" value="{{value}}"
       class="text ui-widget-content ui-corner-all">
</p>
{% endfor %}

您可以如下声明数组

{% set arr = [{'element1': 'value1','element2' : 'value2'},{'element1': 'value1','element2' : 'value2'},{'element1': 'value1','element2' : 'value2'}] %}