Odpowiedzi:
W Twig nie ma fajnego sposobu na zrobienie tego. Jest to jednak możliwe dzięki zastosowaniu filtru scalającego:
{% set arr = arr|merge({'element': 'value'}) %}
.
i []
są bardzo podobne w Twig i myliłem się. Sprawdziłem to i zredagowałem odpowiedź.
'element'
. Znalazłem odpowiedź @ LivaX poniżej. Tak więc byłoby {% set arr = arr|merge({(key): 'value'}) %}
.
{{ UI.button({'type':'submit'}) }}
i wszystkie te makra używają | merge do ustawiania domyślnych parametrów, więc istnieje logiczna potrzeba ...
Napotkałem ten problem, ale próbowałem utworzyć indeksy całkowite zamiast indeksu asocjacyjnego, takiego jak „element”.
Musisz również chronić swój klucz indeksu za ()
pomocą filtru scalającego:
{% set arr = arr|merge({ (loop.index0): 'value'}) %}
Możesz teraz dodać niestandardowy klucz indeksu, taki jak ('element'~loop.index0)
Jeśli potrzebujesz tylko inicjalizacji:
{% set items = { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'unknown' } %}
Próbowałem odpowiedzi @LivaX, ale nie działa, łączenie tablicy, w której klucze są numeryczne, nie zadziała ( https://github.com/twigphp/Twig/issues/789 ).
To zadziała tylko wtedy, gdy klucze są łańcuchami
To, co zrobiłem, to odtworzenie innej tabeli ( temp
) z początkowej tabeli ( t
) i uczynienie kluczy ciągiem, na przykład:
{% for key , value in t%}
{% set temp= temp|merge({(key~'_'):value}) %}
{% endfor %}
t
klawisze: 0, 1, 2 ..
temp
klucze: 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'%}
Dzięki za ten wątek - udało mi się również stworzyć tablicę z (loop.index0) i wysłać do twig.
Uważam, że ten problem jest bardzo irytujący, a moje rozwiązanie jest być może ortodoksyjne i nie jest zgodne z filozofią Twig, ale opracowałem następujące elementy:
$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);
które można wykorzystać w następujący sposób:
{% set arr = set_element (arr, 'element', 'wartość')%}
Po prostu użyj tego w ten sposób {% set arr={'key':'value'} %}
(bez spacji po :
), działa dobrze.
Ale kiedy używam go wewnątrz pętli for, aby uczynić go tablicą, nie działa poza zakresem 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
Miałem ten problem kiedyś temu. Wyobraź sobie, że masz tablicę taką jak ta:
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'
}
Więc chcesz pokazać te dane w dwóch wierszach, ale usuń hasło z tej listy. W tym celu podzielenie na 2 tablice będzie łatwe dzięki slice
filtrowi. Musimy jednak usunąć hasło. Z tego powodu używam tego fragmentu. Chodzi o to, aby wszystkie elementy były mniejsze niż data
rozmiar elementów podzielony przez 2. Aby to obliczyć, używamy filtra length
. Teraz, aby uzyskać indeks bieżącego elementu, którego używamy loop.index
. I na koniec * wypychamy element asocjacyjny w lewej lub prawej tablicy. Tablica asocjacyjna ma dwa komponenty key
i value
. Aby odwołać się do klucza tablicy w twit, używamy operatora ()
i używamy merge
filtru, aby wepchnąć go do tablicy, jak pokazano tutaj{% set left_list = left_list|merge({ (key): value }) %}
To jest kompletne rozwiązanie.
{% 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 %}