Yanıtlar:
Twig'de bunu yapmanın güzel bir yolu yok. Bununla birlikte, birleştirme filtresini kullanarak mümkündür:
{% set arr = arr|merge({'element': 'value'}) %}
.
ve []
Twig çok benzer ve yanılmışım. Baktım ve cevabımı düzenledim.
'element'
. @ LivaX'ın cevabını aşağıda buldum. Yani olur {% set arr = arr|merge({(key): 'value'}) %}
.
{{ UI.button({'type':'submit'}) }}
ve tüm bu makrolar varsayılan parametreleri ayarlamak için | birleştirme kullanır, bu nedenle buna mantıksal bir ihtiyaç vardır ...
Bu problemle karşılaştım ama 'element' gibi ilişkisel indeks yerine tamsayı indeksleri oluşturmaya çalışıyordum.
()
Birleştirme filtresini kullanarak dizin anahtarınızı da korumanız gerekir :
{% set arr = arr|merge({ (loop.index0): 'value'}) %}
Artık özel dizin anahtarı ekleyebilirsiniz. ('element'~loop.index0)
Yalnızca başlatma gerekiyorsa:
{% set items = { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'unknown' } %}
@LivaX'in cevabını denedim ama işe yaramıyor, anahtarların çalışmadığı bir diziyi birleştirerek ( https://github.com/twigphp/Twig/issues/789 ).
Bu yalnızca anahtarlar dizge olduğunda işe yarar
Yaptığım şey, temp
ilk tablodan ( t
) başka bir tabloyu ( ) yeniden oluşturmak ve anahtarları bir dizge yapmak, örneğin:
{% for key , value in t%}
{% set temp= temp|merge({(key~'_'):value}) %}
{% endfor %}
t
tuşlar: 0, 1, 2 ..
temp
anahtarlar: 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'%}
Bu iş parçacığı için teşekkürler - (loop.index0) ile bir dizi oluşturup twig'e gönderebildim.
Bu sorunu çok can sıkıcı buldum ve benim çözümüm belki de ortodoks ve Twig felsefesine uygun değil, ancak aşağıdakileri geliştirdim:
$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);
aşağıdaki gibi kullanılabilir:
{% set arr = set_element (dizi, 'öğe', 'değer')%}
Sadece bunu gibi kullanın {% set arr={'key':'value'} %}
(sonrasında boşluk bırakmayın :
), iyi çalışıyor.
Ama onu bir dizi yapmak için bir for döngüsü içinde kullandığımda, for kapsamının dışında çalışmıyor.
{% 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
Bu problemi bir süre önce yaşadım. Bunun gibi bir diziniz olduğunu hayal edin:
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'
}
Yani, bu verileri iki satırda göstermek, ancak bu listeden şifreyi kaldırmak istiyorsunuz. Bu amaçla, slice
filtre ile 2 diziye bölünmek kolay olacaktır . Ancak şifreyi kaldırmamız gerekiyor. Bu nedenle, bu pasajı kullanıyorum. Buradaki fikir, data
öğelerin boyutunun 2'ye bölünmesinden daha küçük tüm öğeleri koymaktır . Bunu hesaplamak için filtreyi kullanıyoruz length
. Şimdi kullandığımız mevcut elemanın indeksini almak için loop.index
. Ve son olarak, sol veya sağ dizide bir ilişkilendirilebilir öğeyi itiyoruz. İlişkilendirilebilir bir dizinin iki bileşeni vardır key
ve value
. Twit'te bir dizi anahtarına başvurmak ()
için operatörümüzü kullanırız ve merge
burada gösterildiği gibi diziye itmek için filtreyi kullanırız{% set left_list = left_list|merge({ (key): value }) %}
Tam çözüm budur.
{% 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 %}