Twig 在不应该的时候洗牌数组,包括重复项


Twig shuffled array including duplicates when it shouldn't

我有一个简单的值数组。 我需要输出其内容的"随机"子集,但没有重复。但是,到目前为止,我得到的是重复项。

服务器没有安装 Twig 数组扩展,所以我无法访问随机播放过滤器。

哦,如果有更好的方法,我愿意接受建议。

{% set arrImgs = {'0':'a','1':'b','2':'c','3':'d','4':'e','5':'f','6':'g','7':'h'} %}
{% set outputQty = 5 %}
{% set randomizedArr = [] %}  
{# create new array of randomly selected elements (just to shuffle the order)   
   and limit the result to outputQty #}
{% for i in 0..100 if  randomizedArr|length < outputQty %} 
    {% set tmpImg = [random(arrImgs)] %}
    {% if tmpImg not in randomizedArr %}
        {% set randomizedArr = randomizedArr|merge(tmpImg) %} 
    {% endif %}
{% endfor %} 

{% for img in randomizedArr %}
    {{ img }}, 
{% endfor %}

由于有一个扩展,我建议尽可能安装它。当然,我想如果是这样的话,你会这样做的。

您的代码不能完全按原样工作,但可以使用几个关键周。

{% set arrImgs = {'0':'a','1':'b','2':'c','3':'d','4':'e','5':'f','6':'g','7':'h'} %}
{% set outputQty = 5 %}
{% set randomizedArr = [] %}  
{# create new array of randomly selected elements (just to shuffle the order)   
   and limit the result to outputQty #}
{% for i in 0..100 if  outputQty < arrImgs|length and randomizedArr|length < outputQty %} 
    {% set tmpImg = random(arrImgs) %}
    {% if tmpImg not in randomizedArr %}
        {% set randomizedArr = randomizedArr|merge([tmpImg]) %} 
    {% endif %}
{% endfor %} 

{% for img in randomizedArr %}
    {{ img }}, 
{% endfor %}

请注意,我在 for 循环中添加了一个检查,这将确保您不会通过请求比 arrImgs 数组可以提供的更多的唯一项来创建无限循环。此外,您的检查不起作用,因为您的randomizedArr从不包含任何哈希项目,并且您set tmpImg包含您从arrImgs中选择的项目的哈希。通过将转换为 必须 到实际的merge调用,可以解决此问题。