Twig: in_array oder ähnliches innerhalb der if-Anweisung möglich?

207

Ich benutze Twig als Template-Engine und ich liebe es wirklich. Jetzt bin ich jedoch in eine Situation geraten, die definitiv einfacher zu erreichen sein muss als ich gefunden habe.

Was ich gerade habe, ist Folgendes:

{% for myVar in someArray %}    
    {% set found = 0 %}
    {% for id, data in someOtherArray %}
        {% if id == myVar %}
            {{ myVar }} exists within someOtherArray.
            {% set found = 1 %} 
        {% endif %}
    {% endfor %}

    {% if found == 0 %}
        {{ myVar }} doesn't exist within someOtherArray.
    {% endif %}
{% endfor %}

Was ich suche, ist eher so etwas:

{% for myVar in someArray %}    
    {% if myVar is in_array(array_keys(someOtherArray)) %}
       {{ myVar }} exists within someOtherArray.
    {% else %}
       {{ myVar }} doesn't exist within someOtherArray.
    {% endif %}
{% endfor %}

Gibt es eine Möglichkeit, dies zu erreichen, die ich noch nicht gesehen habe?

Wie kann ich innerhalb der Testfunktion auf myVar zugreifen, wenn ich eine eigene Erweiterung erstellen muss?

Danke für Ihre Hilfe!

Verstauchung
quelle
3
Яaffael1984 hat die richtige Antwort. Aber was Sie versuchen zu tun, sollte in der Steuerung erfolgen, nicht in der Ansicht! Formatieren Sie Ihr Array und geben Sie der Ansicht eine saubere Note, um die beste Lesbarkeit zu erzielen.
Vivien
6
Ich nehme an, es hängt wirklich vom Kontext ab, welcher Weg sinnvoller ist, meinst du nicht auch?
Verstauchung

Antworten:

459

Sie müssen nur die zweite Zeile Ihres zweiten Codeblocks von ändern

{% if myVar is in_array(array_keys(someOtherArray)) %}

zu

{% if myVar in someOtherArray|keys %}

In ist der Containment-Operator und Keys ein Filter, der Arrays-Schlüssel zurückgibt.

Raffael
quelle
109
Wenn Sie das gleiche wie in_array () in PHP erreichen möchten, lassen Sie den Schlüsselfilter aus
Burgi
24
+ 1 Und auch die Negation ist {% if item not in array %}und nicht {% if not _entry.id in array %}, also ist es anders {% if not var is null %}.
Insertusernamehere
8
Sie können auch definiert verwenden: {% if someOtherArray.myVar is defined %}( twig.sensiolabs.org/doc/tests/defined.html )
engen
90

Nur um hier ein paar Dinge zu klären. Die akzeptierte Antwort entspricht nicht PHP in_array .

Verwenden Sie den folgenden Ausdruck, um dasselbe wie PHP in_array zu tun :

{% if myVar in myArray %}

Wenn Sie dies negieren möchten, sollten Sie Folgendes verwenden:

{% if myVar not in myArray %}
Wim Mostmans
quelle
1
Diese beiden Punkte scheinen durch die Kommentare zur akzeptierten Antwort im Jahr 2012 abgedeckt worden zu sein. Diese Antwort scheint nichts extra hinzuzufügen.
William Isted
7
@William Isted diese Antwort fügt den richtigen Weg hinzu, um PHPs in_array()in Zweigen zu machen.
Elvismdev
2
@WilliamIsted Dann sollte diese akzeptierte Antwort bearbeitet werden, um korrekt zu sein.
user1032531
3
Es ist besser, Antworten in Kommentaren in tatsächliche Antworten umzuwandeln, da Kommentare viel häufiger gelöscht werden.
Nathan Arthur
^ - gelöscht oder einfach ignoriert
Cid
16

Versuche dies

{% if var in ['foo', 'bar', 'beer'] %}
    ...
{% endif %}
Arthur Veselov
quelle
10

ein weiteres Beispiel nach @jake stayman:

{% for key, item in row.divs %}
    {% if (key not in [1,2,9]) %} // eliminate element 1,2,9
        <li>{{ item }}</li>
    {% endif %}
{% endfor %}
Dung
quelle
0

Obwohl die obigen Antworten richtig sind, habe ich bei der Verwendung des ternären Operators einen benutzerfreundlicheren Ansatz gefunden.

{{ attachment in item['Attachments'][0] ? 'y' : 'n' }}

Wenn jemand foreach durcharbeiten muss, dann

{% for attachment in attachments %}
    {{ attachment in item['Attachments'][0] ? 'y' : 'n' }}
{% endfor %}
sh6210
quelle