从Twig设置数组元素

问题描述 投票:117回答:9

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

我尝试下一步:

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

但我收到以下错误:

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

php twig
9个回答
191
投票

在Twig中没有很好的方法。但是,可以使用合并过滤器:

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

73
投票

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

您还需要使用合并过滤器使用()保护索引键:

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

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


16
投票

如果初始化只需要:

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

2
投票

只需像{% 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 not work, say title is not defined

谢谢你的关注。 (英语不好,对不起!)


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。


1
投票

我已经尝试了@LivaX的答案,但它不起作用,合并一个数字,其中键是数字不会工作(https://github.com/twigphp/Twig/issues/789)。

只有当键是字符串时才会起作用

我所做的是从初始表(temp)重新创建另一个表(t)并将键设为字符串,例如:

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

t键:0,1,2 ..

temp键:0_,1_,2_ ....


1
投票

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


0
投票

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


0
投票

我前一段时间遇到过这个问题。想象一下,你有一个像这样的阵列:

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之外。为了计算这个,我们使用过滤器length。现在要获取当前元素的索引,我们用户loop.index。最后我们*在左或右数组中推送一个关联元素。关联数组有两个组件keyvalue。为了在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 %}
© www.soinside.com 2019 - 2024. All rights reserved.