Gałązka: in_array lub podobny możliwy w ciągu instrukcji if?

207

Używam Twiga jako silnika szablonów i bardzo mi się podoba. Teraz jednak natknąłem się na sytuację, która z pewnością musi być osiągnięta w prostszy sposób, niż znalazłem.

Mam teraz:

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

To, czego szukam, to coś więcej:

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

Czy istnieje sposób na osiągnięcie tego, czego jeszcze nie widziałem?

Jeśli muszę utworzyć własne rozszerzenie, jak mogę uzyskać dostęp do myVar w ramach funkcji testowej?

Dzięki za pomoc!

zwichnięcie
źródło
3
Яaffael1984 ma właściwą odpowiedź. Ale to, co próbujesz zrobić, powinno być zrobione w kontrolerze, a nie w widoku! Sformatuj tablicę, a następnie ułóż widok w celu uzyskania najlepszej czytelności.
Vivien
6
Myślę, że to naprawdę zależy od kontekstu, który sposób ma większy sens, nie sądzisz?
zwichnięcie

Odpowiedzi:

459

Musisz tylko zmienić drugi wiersz drugiego bloku kodu z

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

do

{% if myVar in someOtherArray|keys %}

in to operator przechowujący i klucze filtr, który zwraca klucze tablic.

Raffael
źródło
109
Jeśli chcesz osiągnąć to samo, co in_array () w PHP, pomiń filtr kluczy
Burgi
24
+ 1 A także negacja jest {% if item not in array %}i nie {% if not _entry.id in array %}, więc różni się od tego {% if not var is null %}.
inserttusernamehere
8
Możesz także użyć zdefiniowanego: {% if someOtherArray.myVar is defined %}( twig.sensiolabs.org/doc/tests/defined.html )
tight
90

Żeby wyczyścić kilka rzeczy tutaj. Odpowiedź, która została zaakceptowana, nie jest taka sama jak PHP in_array .

Aby zrobić to samo co PHP in_array, użyj następującego wyrażenia:

{% if myVar in myArray %}

Jeśli chcesz to zanegować, powinieneś użyć tego:

{% if myVar not in myArray %}
Wim Mostmans
źródło
1
Wydaje się, że te dwie kwestie zostały uwzględnione w komentarzach do przyjętej odpowiedzi w 2012 r. Wydaje się, że ta odpowiedź nie dodaje nic więcej.
William Isted,
7
@William Isted ta odpowiedź dodaje właściwy sposób wykonywania PHP na in_array()gałązce.
elvismdev
2
@WilliamIsted Następnie zaakceptowaną odpowiedź należy edytować, aby była poprawna.
user1032531
3
Lepiej jest, aby odpowiedzi podane w komentarzach zamieniły się w rzeczywiste odpowiedzi, ponieważ o wiele bardziej prawdopodobne jest, że komentarze zostaną usunięte.
Nathan Arthur
^ - usunięte lub po prostu zignorowane
Cid
16

Spróbuj tego

{% if var in ['foo', 'bar', 'beer'] %}
    ...
{% endif %}
Arthur Veselov
źródło
10

inny przykład następujący po @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 %}
Łajno
źródło
0

Chociaż powyższe odpowiedzi są prawidłowe, znalazłem coś bardziej przyjaznego dla użytkownika podczas korzystania z operatora trójskładnikowego.

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

Jeśli więc ktoś musi przejść przez foreach,

{% for attachment in attachments %}
    {{ attachment in item['Attachments'][0] ? 'y' : 'n' }}
{% endfor %}
sh6210
źródło