wake-up-neo.com

Einstellelement eines Arrays aus Twig

Wie kann ich ein Mitglied eines bereits vorhandenen Arrays von Twig festlegen?

Ich habe es als nächstes versucht:

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

aber ich habe folgenden fehler:

Unerwarteter Token "Interpunktion" des Werts "[" ("Ende des Anweisungsblocks" Erwartet) in ...

117
falinsky

Es gibt keine schöne Möglichkeit, dies in Twig zu tun. Es ist jedoch möglich, den Merge-Filter zu verwenden:

{% set arr = arr|merge({'element': 'value'}) %}
190
Paulpro

Ich bin auf dieses Problem gestoßen, habe aber versucht, Integer-Indizes anstelle des assoziativen Index wie 'Element' zu erstellen.

Sie müssen Ihren Indexschlüssel auch mit () mit dem Merge-Filter schützen:

{% set arr = arr|merge({ (loop.index0): 'value'}) %} 

Sie können jetzt einen benutzerdefinierten Indexschlüssel wie ('element'~loop.index0) hinzufügen.

71
LivaX

Wenn die Initialisierung nur benötigt:

{% set items = { 'Apple': 'fruit', 'orange': 'fruit', 'peugeot': 'unknown' } %}
15
pleerock

Verwenden Sie einfach diesen Code wie {% set arr={'key':'value'} %} (ohne Leerzeichen nach dem ':'), es funktioniert gut. Wenn ich jedoch mit 'for' ein Array erstellte, kann es nicht außerhalb des for-Bereichs funktionieren.

          {% 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 not work, say title is not defined

Danke für ihre Aufmerksamkeit. (schlechtes Englisch, tut mir leid!)

2
user1321109
{% 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'%}

Danke für diesen Thread - ich konnte auch ein Array mit (loop.index0) erstellen und an twig senden.

2
n8tron

Ich fand dieses Problem sehr ärgerlich und meine Lösung ist vielleicht orthodox und entspricht nicht der Twig-Philosophie, aber ich habe folgendes entwickelt:

$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);

das kann wie folgt verwendet werden:

{% set arr = set_element (arr, 'Element', 'Wert')%}

1
savedario

Ich habe die Antwort von @LivaX ausprobiert, aber es funktioniert nicht, indem ich ein Array mit numerischen Schlüsseln zusammenbringe, die funktionieren ( https://github.com/twigphp/Twig/issues/789 ). 

Das funktioniert nur, wenn Schlüssel Strings sind 

Was ich getan habe, ist, eine andere Tabelle (temp) aus der Ausgangstabelle (t) neu zu erstellen und die Schlüssel zu einem String zu machen, zum Beispiel: 

{% for key , value in t%}
{% set temp= temp|merge({(key~'_'):value}) %}
{% endfor %}

t Schlüssel: 0, 1, 2 .. 

temp Schlüssel: 0_, 1_, 2_ .... 

1
zizoujab

Ich hatte dieses Problem vor einiger Zeit. Stellen Sie sich vor, Sie haben ein Array wie dieses:

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

Sie möchten diese Daten also in zwei Zeilen anzeigen, das Kennwort jedoch aus dieser Liste entfernen. Zu diesem Zweck ist die Aufteilung in 2 Arrays mit dem slice-Filter einfach. Wir müssen jedoch das Passwort entfernen. Aus diesem Grund verwende ich dieses Snippet. Die Idee ist, alle Elemente kleiner als die data-Elementgröße durch 2 zu setzen. Um dies zu berechnen, verwenden wir den Filter length. Um nun den Index des aktuellen Elements abzurufen, verwenden wir loop.index. Und schließlich * schieben wir ein assoziatives Element in das linke oder rechte Feld. Ein assoziatives Array hat zwei Komponenten key und value. Um auf einen Array-Schlüssel in twit zu verweisen, verwenden wir den Operator () und verwenden den merge-Filter, um in das Array zu schieben, wie hier gezeigt {% set left_list = left_list|merge({ (key): value }) %}.

Dies ist die komplette Lösung.

{% 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
Teocci

Ich hatte ein Multi-Dimension-Array. Die einzige Lösung, die ich herausfinden konnte, ist das Erstellen eines neuen temporären Arrays und update/add der Informationen, die an eine andere Zweigfunktion weitergeleitet wurden.

0
shobekhan