从 Twig 设置数组元素

如何从 Twig 设置已经存在的数组的成员?

我试着用另一种方法:

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

但我得到了以下错误:

值的意外标记“标点符号”[”(“语句块结束”) 预期)在..。

148013 次浏览

在 Twig 中没有很好的方法来做到这一点,但是,可以通过使用合并过滤器来实现:

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

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

{% set arr = arr|merge({(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

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

你需要保护你的索引键与 ()使用合并过滤器以及:

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

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

如果只需要初始化:

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

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

我已经试过@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 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)创建一个数组并发送给 twig。

我已经发现这个问题非常恼人,我的解决方案可能是正统的,并不符合 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’)% }

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

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过滤器可以很容易地将数组拆分为两个数组。但是,我们必须删除密码。因此,我使用这个片段。这个想法是把所有的元素小于 data的元素大小除以2。为了计算这一点,我们使用过滤器 length。现在,为了获得当前元素的索引,我们使用 loop.index。最后,我们在左或右数组中推入一个关联元素。关联数组由两部分组成: ABc4和 ABc5。为了在 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 myArray = myArray + myArray2 %}

添加我的答案,以防有人需要更新数组时,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 %}

可以按如下方式声明数组

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