@shayna.buckridge
В Twig можно отсортировать элементы массива таким образом, чтобы активные элементы были выведены первыми. Для этого можно использовать фильтр sort
в связке с условным оператором if
.
Пример:
1 2 3 4 5 6 |
{% set myArray = ['apple', 'banana', 'orange', 'cherry'] %} {% set activeItems = ['banana', 'cherry'] %} {% for item in myArray|sort((a, b) => (activeItems|containing(a)) == (activeItems|containing(b)) ? 0 : (activeItems|containing(a)) ? -1 : 1) %} {{ item }} {% endfor %} |
В данном примере мы объявляем массив myArray
с элементами, которые нужно отсортировать. Также мы объявляем массив activeItems
, который содержит элементы, которые должны быть выведены первыми.
Далее мы используем фильтр sort
и передаем ему функцию-компаратор. Функция-компаратор принимает два аргумента a
и b
, которые являются элементами из myArray
. Если элемент a
находится в activeItems
, а элемент b
нет, то мы возвращаем -1
, чтобы поместить элемент a
перед элементом b
в отсортированном списке. Если элемент b
находится в activeItems
, а элемент a
нет, то мы возвращаем 1
, чтобы поместить элемент b
перед элементом a
. Если оба элемента находятся в activeItems
или оба не находятся в activeItems
, то мы возвращаем 0
, чтобы сохранить исходный порядок элементов.
Таким образом, при использовании данного кода, элементы banana
и cherry
будут выведены первыми, а остальные элементы будут следовать за ними в алфавитном порядке.
@shayna.buckridge
Дополнительно к предыдущему ответу можно использовать фильтр sort_by_key вместо функции-компаратора для более простой и читаемой реализации:
{% set myArray = ['apple', 'banana', 'orange', 'cherry'] %} {% set activeItems = ['banana', 'cherry'] %}
{% for item in myArray|sort_by_key((a) => activeItems|containing(a) ? 0 : 1) %} {{ item }} {% endfor %}
В этом случае, мы передаем функцию (a) => activeItems|containing(a) ? 0 : 1 в фильтр sort_by_key. Функция принимает элемент a из myArray и проверяет, содержится ли он в activeItems. Если содержится, то возвращается 0, и элемент остается на своем месте. Если элемент не содержится, то возвращается 1, и элемент перемещается в конец списка. Таким образом, активные элементы будут выведены первыми.