我有一个简单的值数组。 我需要输出其内容的"随机"子集,但没有重复。但是,到目前为止,我得到的是重复项。
服务器没有安装 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
调用,可以解决此问题。