Risposte:
Non esiste un modo carino per farlo in Twig. Tuttavia, è possibile utilizzando il filtro unione:
{% set arr = arr|merge({'element': 'value'}) %}
.
e []
sono molto simili in Twig e ho sbagliato. Ho cercato e modificato la mia risposta.
'element'
. Di seguito ho trovato la risposta di @LivaX. Quindi sarebbe {% set arr = arr|merge({(key): 'value'}) %}
.
{{ UI.button({'type':'submit'}) }}
e tutte queste macro usano | merge per impostare i parametri predefiniti, quindi c'è una logica necessità per questo ...
Ho riscontrato questo problema ma stavo cercando di creare indici interi anziché indici associativi come 'element'.
Devi proteggere la tua chiave di indice anche ()
usando il filtro di unione:
{% set arr = arr|merge({ (loop.index0): 'value'}) %}
Ora puoi aggiungere una chiave di indice personalizzata come ('element'~loop.index0)
Se l'inizializzazione richiede solo:
{% set items = { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'unknown' } %}
Ho provato la risposta di @LivaX ma non funziona, unendo un array in cui le chiavi sono numeriche non funzionerà ( https://github.com/twigphp/Twig/issues/789 ).
Funzionerà solo quando le chiavi sono stringhe
Quello che ho fatto è ricreare un'altra tabella ( temp
) dalla tabella iniziale ( t
) e rendere le chiavi una stringa, ad esempio:
{% for key , value in t%}
{% set temp= temp|merge({(key~'_'):value}) %}
{% endfor %}
t
tasti: 0, 1, 2 ..
temp
chiavi: 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'%}
Grazie per questo thread - Sono stato anche in grado di creare un array con (loop.index0) e inviarlo a ramoscello.
Ho trovato questo problema molto fastidioso e la mia soluzione è forse ortodossa e non in linea con la filosofia di Twig, ma ho sviluppato quanto segue:
$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);
che può essere utilizzato come segue:
{% set arr = set_element (arr, 'element', 'value')%}
Basta usare questo tipo {% set arr={'key':'value'} %}
(senza spazio dopo il :
), funziona bene.
Ma quando lo uso all'interno di un ciclo for, per renderlo un array, non funziona al di fuori dell'ambito 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
Ho avuto questo problema qualche tempo fa. Immagina di avere un array come questo:
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'
}
Quindi, vuoi mostrare questi dati in due righe, ma rimuovi la password da quell'elenco. A tal fine, dividere in 2 matrici sarà facile con il slice
filtro. Tuttavia, dobbiamo rimuovere la password. Per questo motivo, sto usando questo frammento. L'idea è di mettere tutti gli elementi in meno della data
dimensione degli elementi divisa per 2. Per calcolare questo, usiamo il filtro length
. Ora per ottenere l'indice dell'elemento corrente che utilizziamo loop.index
. E infine * spingiamo un elemento associativo nella matrice sinistra o destra. Un array associativo ha due componenti key
e value
. Per fare riferimento a una chiave di array in twit, utilizziamo l'operatore ()
e utilizziamo il merge
filtro per inserire l'array come mostrato qui{% set left_list = left_list|merge({ (key): value }) %}
Questa è la soluzione completa
{% 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 %}