web-dev-qa-db-ja.com

Twigからの配列の要素の設定

Twigから既存のアレイのメンバーを設定するにはどうすればよいですか?

私はそれを次の方法で試しました:

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

しかし、私は次のエラーを受け取りました:

値「[」の予期しないトークン「句読点」(「ステートメントブロックの終わり」が必要)...

118
falinsky

Twigでこれを行う良い方法はありません。ただし、マージフィルターを使用することで可能です。

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

私はこの問題に遭遇しましたが、「要素」のような連想インデックスの代わりに整数インデックスを作成しようとしていました。

マージフィルターも使用して、()でインデックスキーを保護する必要があります。

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

('element'~loop.index0)などのカスタムインデックスキーを追加できるようになりました

73
LivaX

初期化のみが必要な場合:

{% set items = { 'Apple': 'fruit', 'orange': 'fruit', 'peugeot': 'unknown' } %}
18
pleerock

{% 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
user1321109
{% 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に送信することもできました。

2
n8tron

この問題は非常に面倒で、私の解決策はオーソドックスであり、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')%}

1
savedario

私は@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
zizoujab

しばらく前にこの問題がありました。次のような配列があると想像してください。

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'
}

そのため、このデータを2行で表示したいが、そのリストからパスワードを削除する必要があります。このため、sliceフィルターを使用すると、2つの配列に簡単に分割できます。ただし、パスワードを削除する必要があります。そのため、このスニペットを使用しています。アイデアは、data要素のサイズを2で割った値よりも小さいすべての要素を配置することです。これを計算するには、フィルターlengthを使用します。現在の要素のインデックスを取得するには、loop.indexを使用します。そして最後に、左または右の配列に連想要素をプッシュします。連想配列には、keyvalueの2つのコンポーネントがあります。 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 %}
0
Teocci

多次元配列がありました。私が見つけた唯一の解決策は、新しい一時配列とpdate/add情報を作成することです。この情報はさらに別のtwig関数に渡されました。

0
shobekhan