Twig如何检查值是否在数组中

5

我在Twig中遇到了问题,无法检查数组中是否存在某个值。

如果购物车中有特定产品,则我想在结算时隐藏运输方式。

Twig是我唯一可以使用的代码,所以我必须在其中找到逻辑。

如果购物车中存在产品ID为1234的产品,则希望隐藏#certain_div

因此,我的代码如下:

  {% if checkout %}

      {% set array = theme.sku_shipping_rule | split(',') %}
     // theme.sku_shipping_rule = a text string like 1234, 4321, 5478         

        {% if checkout.products %}
         {% for product in checkout.products %}
          {% if product.sku in array %}

           <style>
             #certain_div {
                display: none;
              }
           </style>

          {% endif %}
         {% endfor %}
       {% endif %}

    {% endif %}

我面临的问题是,我的代码似乎总是返回true。因此,即使product.sku与数组中的值不匹配,它仍然隐藏了#certain_div。我已经在<style>之前放置了{{ product.sku }}进行测试。
请问我错在哪里?
非常感谢任何帮助!
更新:
我已经更新了问题/代码以显示发生了什么。
{% if checkout %}
    {% set skuToCheck = theme.sku_shipping_rule | split(',') %}
    {% set skuInCart = [] %}
    {% if checkout.quote.products %}
        {% for product in checkout.quote.products %}
            {% set skuInCart = skuInCart | merge([product.sku]) %}
        {% endfor %}
     {% endif %}

     {% for myVar in skuInCart %}
         {{ myVar }}<br/>
     {% endfor %}

     // this prints
     PSYGA1 // where this sku should NOT match
     FP32MA4

    {% for myVar in skuToCheck  %}  
        {{ myVar }}<br/>

        // this prints
        FP32LY4
        FP32STR4
        FP32MA4   

        {% if myVar in skuInCart %} // also tried with | keys filter
            {{ myVar }} is found
        {% endif %}
    {% endfor %}
{% endif %}

所以我做的是把购物车中的产品的sku放在一个数组skuInCart中。接下来我想检查myVar是否存在于skuInCart数组中。如果是,则打印myVar is found

预期的结果应该是只打印匹配的结果,但实际上它会打印出skuInCart数组中所有的值(使用keys过滤器),或者完全没有使用keys过滤器而变成空白。


1
您编写的代码应该反映您的思维方式。您怎么知道它总是返回 True? 我猜问题与您在循环内输出样式块有关。 - TheGentleman
我必须同意GentlemanMax的观点,你的代码应该是可行的,似乎这可能是一个重叠样式问题。你是否改变了certain_div的值?因为如果你将其应用于所有div,那么会有两个问题。第一,ID应该是唯一的;第二,你正在对你可能不想要的元素应用样式。 - Chase
@GentlemanMax:我更新了我的问题以展示发生了什么。你们有任何意见吗?谢谢... - Meules
@Chausser:请看我的更新回答! - Meules
2个回答

2

从理论上讲,您正在做的应该有效,可以查看此fiddle示例以向您展示工作演示:

https://twigfiddle.com/yvpbac

基本上:

<div id="certain_div">
This should not show up
</div>

{% set searchForSku = "890" %}
{% set productSkuArrayString = "1234,4567,890" %}
{% set productSkuArray = productSkuArrayString|split(',') %}
{% if searchForSku in productSkuArray %}
<style>
    #certain_div {
        display: none;
    }
</style>
{% endif %}

<!-- New Trial -->

<div id="certain_div">
This should show up
</div>

{% set searchForSku = "891" %}
{% set productSkuArrayString = "1234,4567,890" %}
{% set productSkuArray = productSkuArrayString|split(',') %}
{% if searchForSku in productSkuArray %}
<style>
    #certain_div {
        display: none;
    }
</style>
{% endif %}

将导致:

<div id="certain_div">
This should not show up
</div>

<style>
    #certain_div {
        display: none;
    }
</style>

<!-- New Trial -->

<div id="certain_div">
This should show up
</div>

2

您可以使用iterable来检查变量是否为数组或可遍历对象:

{% if items is iterable %}
  {# stuff #}
{% endif %}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接