2015-02-06 5 views
1

Прежде всего, я изучаю Twig. Мне было интересно, можно ли с помощью Twig сравнить два разных значения из разных массивов/списков ?!Twig сравнить два значения в разных массивах

У меня есть два списка пунктов, которые я называю их так, как:

{% if page.cart %} 
{% for product in page.cart.products %} 
    {{ product.id }} 
{% endfor %} 
{% endif %} 

И:

{% if products %} 
{% for product in products %} 
    {{ product.id }} 
{% endfor %} 
{% endif %} 

Я хочу, чтобы сравнить оба product.id «S, так что я могу создать новое заявление. Есть ли способ сравнить оба значения? Идея состоит в том, чтобы проверить, присутствует ли идентификатор в page.cart.products, и если да, то что-то делать.

Я хочу создать новое заявление для отображения информации. Что-то вроде этого:

{% if page.cart %} 
{% for product in page.cart.products %} 
    {% set cartId %}{{ product.id }}{% endset %} 
{% endfor %} 
{% endif %} 

{% if products %} 
{% for product in products %} 
    {% set listId %}{{ product.id }}{% endset %} 
{% endfor %} 
{% endif %} 

{% if cartId == listId %} 
.... do this .... 
{% endif %} 

Любая помощь очень ценится!

+0

Это невозможно сделать с двумя разными петлями, если вы ищете один ID. –

+1

Почему бы не сравнить его с контроллером и не вернуть результат? он более эффективен, чем переменные return 2, а затем сравнивается только для показа одного результата. –

+0

@ColourDalnet: Хорошо, но не могли бы вы привести пример? Я действительно не знаю, с чего начать, так как я довольно новичок в Twig – Meules

ответ

3

Вы можете перебрать один массив и проверить, присутствует ли во втором. id. Если он есть, вы можете что-то сделать.

{# In case you want to store them, you can do so in an array #} 
{% set repeatedIds = [] %} 
{% for productCart in page.cart.products if page.cart %} 
    {% for product in products if products %} 
     {% if productCart.id == product.id %} 
      <p>This id -> {{ product.id }} is already in page.cart.products</p> 
      {% set repeatedIds = repeatedIds|merge([product.id]) %} 
     {% endif %} 
    {% endfor %} 
{% endfor %} 
{{ dump(repeatedIds) }} 

Это очень простой алгоритм поиска, а стоимость квадратичная. Очевидно, что есть более эффективные способы поиска элемента в массиве (хотя это сложнее реализовать).

Если количество продуктов, с которыми вы имеете дело, не очень велико, вы можете использовать это решение. Однако, если у вас есть, скажем, более ста продуктов в каждом массиве (или вы чувствуете, что алгоритм замедляет время загрузки), вы можете сделать этот процесс в контроллере с использованием более сложных методов и PHP и просто пройти результат к шаблону.

Надеюсь, это поможет.

+0

Это не совсем то, что я ищу, но это дало мне неплохие сведения о переходе по массивам. – Meules

+0

Рад помочь :) удачи – acontell

Смежные вопросы