Respostas:
Não há uma maneira legal de fazer isso no Twig. No entanto, é possível usando o filtro de mesclagem:
{% set arr = arr|merge({'element': 'value'}) %}
.
e []
são muito parecidos em Twig e eu estava errado. Eu procurei e editei minha resposta.
'element'
. Encontrei a resposta do @ LivaX abaixo. Então seria {% set arr = arr|merge({(key): 'value'}) %}
.
{{ UI.button({'type':'submit'}) }}
e todas essas macros usam | mesclagem para definir parâmetros padrão, portanto, há uma necessidade lógica para isso ...
Corri para esse problema, mas estava tentando criar índices inteiros em vez de índices associativos como 'elemento'.
Você também precisa proteger sua chave de índice ()
usando o filtro de mesclagem:
{% set arr = arr|merge({ (loop.index0): 'value'}) %}
Agora você pode adicionar uma chave de índice personalizada, como ('element'~loop.index0)
Se a inicialização precisar apenas:
{% set items = { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'unknown' } %}
Tentei a resposta do @LivaX, mas ela não funciona, mesclando uma matriz em que as chaves numéricas não funcionam ( https://github.com/twigphp/Twig/issues/789 ).
Isso funcionará apenas quando as chaves forem strings
O que fiz foi recriar outra tabela ( temp
) da tabela inicial ( t
) e transformar as chaves em uma string, por exemplo:
{% for key , value in t%}
{% set temp= temp|merge({(key~'_'):value}) %}
{% endfor %}
t
teclas: 0, 1, 2 ..
temp
teclas: 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'%}
Obrigado por esta discussão - eu também fui capaz de criar uma matriz com (loop.index0) e enviar para o galho.
Achei esse problema muito irritante, e minha solução talvez seja ortodoxa e não esteja de acordo com a filosofia Twig, mas desenvolvi o seguinte:
$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);
que pode ser usado da seguinte maneira:
{% set arr = set_element (arr, 'elemento', 'valor')%}
Basta usar isso como {% set arr={'key':'value'} %}
(sem espaço em branco após o :
), ele funciona bem.
Mas quando eu o uso dentro de um loop for, para torná-lo um array, ele não funciona fora do escopo 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
Eu tive esse problema há algum tempo. Imagine que você tem uma matriz como esta:
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'
}
Portanto, você deseja mostrar esses dados em duas linhas, mas remova a senha dessa lista. Para isso, dividir em duas matrizes será fácil com o slice
filtro. No entanto, temos que remover a senha. Por esse motivo, estou usando esse trecho. A idéia é colocar todos os elementos menores que o data
tamanho dos elementos dividido por 2. Para calcular isso, usamos o filtro length
. Agora, para obter o índice do elemento atual que utilizamos loop.index
. E, finalmente, pressionamos um elemento associativo na matriz esquerda ou direita. Uma matriz associativa possui dois componentes key
e value
. Para referenciar uma chave de matriz no twit we operator ()
e usamos o merge
filtro para empurrar para dentro da matriz, como mostrado aqui{% set left_list = left_list|merge({ (key): value }) %}
Esta é a solução 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 %}