Twig洗牌阵列,包括重复,不应该

时间:2016-01-28 13:21:36

标签: php arrays twig

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

服务器没有安装Twig Array Extension,因此我无法访问Shuffle过滤器。

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

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

1 个答案:

答案 0 :(得分:0)

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

您的代码不能正常工作,但可以使用几个关键的推文。

{% 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选择的项目的哈希值。通过将转换移至实际的use parent 'Foo::Bar'; 调用,此问题已得到解决。