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


125

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

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

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

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

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

回答:


210

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

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

「。」ステートメントは「[]」と同じなので、解決策ではありません
falinsky

@falinskyそうですね。.そして[]小枝で非常に類似しており、私が間違っていました。調べて回答を編集しました。
ポール、

17
の代わりに動的変数キーを定義する方法を探していました'element'。以下で@LivaXの回答を見つけました。だから、それは{% set arr = arr|merge({(key): 'value'}) %}
Sithu 2015年

これはばかげています。twigが配列値を設定する機能を許可しないのはなぜですか?
Matt Cavanagh

1
@MattCavanagh(Twigなどの)ビューファイルにはビジネスロジックが含まれていないため、これは最終的にモデルで処理する必要があります。ビューは実際にそこにあるものを単にレンダリングすることになっています。私の場合の問題、そして私もあなたに同意する理由は、UIオブジェクトをレンダリングするために小枝マクロを作成することです。{{ UI.button({'type':'submit'}) }}これらすべてのマクロは、デフォルトの
パラメーター

79

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

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

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

次のようなカスタムインデックスキーを追加できます ('element'~loop.index0)


LivaXのおかげで、動的にキーを挿入しようとした場合の実際のソリューションです。
nicolallias


2

@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_...。


同じ問題、これまでのところ解決策はありません。
TyrionGraphiste 2018

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

この問題は非常に迷惑であり、私の解決策はおそらくオーソドックスであり、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

これのように{% 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

1
forループの外で変数を使用する場合は、forループの外で定義する必要があります。ここを参照してください:twig.sensiolabs.org/doc/tags/set.html
user2019515

5
これはあらゆる種類の誤りです。コロンの後のスペースは関係ありません。問題となった配列に要素を設定するのではなく、新しい配列を作成しています。エラーを生成する{{array}}のような配列を出力することはできません。この答えは失敗に満ちており、尋ねられた質問とは無関係です。
redreinard 2015年

3
上記のようにこれが賛成票を持っている理由がわかりません。この「答え」のほとんどすべてが正しくありません...
MariusJP

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

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

次の構文も使用できます。

{% set myArray = myArray + myArray2 %}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.