Как вывести активный элементы первым в twig?

Пользователь

от shayna.buckridge , в категории: PHP , 2 года назад

Как вывести активный элементы первым в twig?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от fidel , 2 года назад

@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 будут выведены первыми, а остальные элементы будут следовать за ними в алфавитном порядке.

Пользователь

от johnpaul.blick , год назад

@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, и элемент перемещается в конец списка. Таким образом, активные элементы будут выведены первыми.