回答:
Twigでこれを行う良い方法はありません。ただし、マージフィルターを使用することで可能です。
{% set arr = arr|merge({'element': 'value'}) %}
.
そして[]
小枝で非常に類似しており、私が間違っていました。調べて回答を編集しました。
'element'
。以下で@LivaXの回答を見つけました。だから、それは{% set arr = arr|merge({(key): 'value'}) %}
。
{{ UI.button({'type':'submit'}) }}
これらすべてのマクロは、デフォルトの
私はこの問題に遭遇しましたが、「要素」のような連想インデックスの代わりに整数インデックスを作成しようとしていました。
()
マージフィルターを使用してインデックスキーを保護する必要もあります。
{% 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)。
キーが文字列の場合にのみ機能します
私がやったことはtemp
、最初のテーブル(t
)から別のテーブル()を再作成し、キーを文字列にすることです。次に例を示します。
{% 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')%}
これのように{% 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
私はいつかこの問題を抱えていました。次のような配列があるとします。
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 %}