Генерация случайных строк в Twig, которые не повторяются - PullRequest
1 голос
/ 10 марта 2020

Я хотел бы создать (как минимум) две разные случайные строки, которые всегда отличаются друг от друга.

{% set firstColour = random(['coral', 'pink', 'black', 'sand']) %}
{% set secondColour = random(['coral', 'pink', 'black', 'sand']) %}


{{ firstColour }} 
{{ secondColour }}

Я думал, что "легким" решением будет сброс второго цвета, если он равен первому

{# before variables are called #} 
{% if firstColour == secondColour %}
    {% set secondColour = '' %}
    {% set secondColour = random(['coral', 'pink', 'black', 'sand']) %}
{% endif %}

Мало того, что это не кажется очень практичным или " чистый ", но это также просто не работает. В документации по веткам или другим темам я не могу найти ничего об установке случайных строк с исключениями.

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

без повторения одной из них: {{firstColor}} {{secondColour}} {{thirdColour}} {{четвертыйColour }} при вызове на странице всегда будет возвращать 4 различных значения.

Есть ли способ добиться с помощью встроенных функций или расширений Twig?

1 Ответ

1 голос
/ 12 марта 2020

Хотя я бы согласился с комментариями, которые вы получили, чтобы на самом деле добиться этого в каком-то PHP контроллере, и эта ветка предназначена для шаблонов, а не для такого рода логики c, вот возможное решение.

Что вы можете сделать, это создать массив randomColours, а затем отфильтровать массив цветов, который у вас есть, на основе того, что уже было добавлено к randomColours.

Здесь будет результирующий код для отображения четырех цветов:

{% set colours = ['coral', 'pink', 'black', 'sand'] %}
{% set randomColours = [] %}
{% for i in 1..colours | length %}
  {% set randomColours = randomColours | merge([random(colours | filter(value => value not in randomColours))]) %}
{% endfor %}

{% for colour in randomColours %}
 {{ colour }}
{% endfor %}

Если вы хотите только два, как в вашем первоначальном примере, вы можете просто переключиться с

{% for i in 1..colours | length %}

до

{% for i in 1..2 %}

Вот скрипка для четырех веток: https://twigfiddle.com/ahtcuo
А вот только для двух: https://twigfiddle.com/ahtcuo/2

...