Twig'den dizi öğesi ayarlama


126

Twig'den zaten var olan bir dizinin üyesini nasıl ayarlayabilirim?

Bir sonraki şekilde yapmayı denedim:

{% set arr['element'] = 'value' %}

ama şu hatayı aldım:

"[" Değerinde beklenmeyen simge "noktalama" ("ifade bloğunun sonu" bekleniyor) ...

Yanıtlar:


211

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'}) %}

"." - ifade "[]" ile aynı olduğundan çözüm değil
falinsky

@falinsky Haklısın. .ve []Twig çok benzer ve yanılmışım. Baktım ve cevabımı düzenledim.
Paul

17
Yerine dinamik değişken anahtarı tanımlamanın bir yolunu arıyordum 'element'. @ LivaX'ın cevabını aşağıda buldum. Yani olur {% set arr = arr|merge({(key): 'value'}) %}.
Sithu

Bu çok aptalca. Twig neden dizi değerlerini ayarlama yeteneğine izin vermiyor?
Matt Cavanagh

1
@MattCavanagh, görüntüleme dosyalarının (Twig gibi) iş mantığı içermemesi gerektiğinden, bu sonuçta modelde ele alınmalıdır. Görüntünün gerçekten orada olanı basitçe göstermesi gerekiyor. Benim durumumda ve neden sizinle aynı fikirdeyim, mesela UI nesnelerini işlemek için twig makroları oluşturmam, örn. {{ 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 ...
Prof83

80

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)


Anahtarları dinamik olarak yerleştirmeye çalıştığınızda gerçek çözüm bu, teşekkürler LivaX!
nicolallias

18

Yalnızca başlatma gerekiyorsa:

{% set items = { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'unknown' } %}

9
Sorun bu değildi.
redreinard

2

@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, tempilk 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_ ....


Aynı sorun, şu ana kadar çözüm yok.
TyrionGraphiste

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.


1

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')%}


1

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

1
Değişkeni for döngüsünün dışında kullanmak istiyorsanız, onu for döngüsünün dışında tanımlamanız gerekir, buraya bakın: twig.sensiolabs.org/doc/tags/set.html
user2019515

5
Bu her türlü yanlış. Kolondan sonraki boşluk önemli değil. Yeni diziler yaratıyorsunuz, dizide soru olan bir eleman ayarlamıyorsunuz. Hata oluşturacak şekilde {{dizi}} gibi bir dizi çıktı veremezsiniz. Bu cevap başarısızlıkla doludur ve sorulan soruyla ilgisizdir.
redreinard

3
Bunun neden olumlu oylar verdiğini anlamıyorum, yukarıda belirtildiği gibi, bu "cevapta" neredeyse her şey yanlış ...
MariusJP

0

Çok boyutlu bir dizim vardı. Bulabildiğim tek çözüm, yeni bir geçici dizi oluşturmak ve daha sonra başka bir twig işlevine aktarılan bilgileri güncellemek / eklemek .


0

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, slicefiltre 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 keyve value. Twit'te bir dizi anahtarına başvurmak ()için operatörümüzü kullanırız ve mergeburada 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 %}

0

Aşağıdaki sözdizimini de kullanabilirsiniz:

{% set myArray = myArray + myArray2 %}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.