Установка элемента массива из Twig - PullRequest
118 голосов
/ 24 февраля 2012

Как я могу установить член уже существующего массива из Twig?

Я попытался сделать это следующим образом:

{% set arr['element'] = 'value' %}

, но я получил следующую ошибку:

Неожиданный токен "пунктуация" значения "[" (ожидается "конец блока операторов") в ...

Ответы [ 9 ]

192 голосов
/ 24 февраля 2012

Нет хорошего способа сделать это в Twig.Однако это возможно при использовании фильтра слияния:

{% set arr = arr|merge({'element': 'value'}) %}
73 голосов
/ 04 апреля 2013

Я столкнулся с этой проблемой, но пытался создать целочисленные индексы вместо ассоциативного индекса, такого как «элемент».

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

{% set arr = arr|merge({ (loop.index0): 'value'}) %} 

Теперь вы можете добавить пользовательский индексный ключ, например ('element'~loop.index0)

17 голосов
/ 23 мая 2013

Если требуется только инициализация:

{% set items = { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'unknown' } %}
2 голосов
/ 13 февраля 2017
{% set links = {} %}

{# Use our array to wrap up our links. #}
{% for item in items %}
  {% set links = links|merge({ (loop.index0) : {'url': item.content['#url'].getUri(), 'text': item.content['#title']} }) %}
{% endfor %}

{%
set linkList = {
  'title': label,
  'links': links
}
%}

{% include '<to twig file>/link-list.twig'%}

Спасибо за эту ветку - я также смог создать массив с (loop.index0) и отправить веточку.

2 голосов
/ 20 мая 2012

Просто используйте это как {% set arr={'key':'value'} %} (без пробела после ':'), это работает хорошо.Но когда я использовал 'for' для создания массива, он не может работать из области for.

          {% for group in user.groups %}
            {% set foo={'loop.index0':'group.id'} %}
            {% set title={'loop.index0':'group.title'} %}
            {{ title }} //it work 
          {% else %}
            {% set foo={'0':'-1'} %}
            {% set title={'0':'未分组'} %}
          {% endfor %}
            {{ title }}  //it not work, say title is not defined

Спасибо за ваше внимание.(плохой английский, прости!)

1 голос
/ 26 июня 2017

Я нашел эту проблему очень раздражающей, и мое решение, возможно, ортодоксально и не соответствует философии Твиг, но я разработал следующее:

$function = new Twig_Function('set_element', function ($data, $key, $value) {
    // Assign value to $data[$key]
    if (!is_array($data)) {
        return $data;
    }
    $data[$key] = $value;
    return $data;
});
$twig->addFunction($function);

, которое можно использовать следующим образом:*

{% set arr = set_element (arr, 'element', 'value')%}

1 голос
/ 01 июля 2016

Я попробовал ответ @LivaX, но он не работает, объединение массива с числовыми ключами не работает (https://github.com/twigphp/Twig/issues/789).

Это будет работать только тогда, когда ключи являются строками

То, что я сделал, - это воссоздание другой таблицы (temp) из исходной таблицы (t) и, например, превращение ключей в строку:

{% for key , value in t%}
{% set temp= temp|merge({(key~'_'):value}) %}
{% endfor %}

t клавиши: 0, 1, 2 ..

temp клавиши: 0_, 1_, 2_ ....

0 голосов
/ 07 февраля 2019

У меня была эта проблема некоторое время назад. Представьте, что у вас есть такой массив:

data = {
    'user': 'admin',
    'password': 'admin1234',
    'role': 'admin',
    'group': 'root',
    'profile': 'admin',
    'control': 'all',
    'level': 1,
    'session': '#DFSFASADASD02',
    'pre_oa': 'PRE-OA',
    'hepa_oa': 'HEPA-OA',
    'pre_ra': 'HEPA-RA',
    'hepa_ra': 'HEPA-RA',
    'deodor_ra': 'DEODOR-RA'
}

Итак, вы хотите показать эти данные в две строки, но удалите пароль из этого списка. Для этого разделить на 2 массива будет легко с фильтром slice. Однако мы должны удалить пароль. По этой причине я использую этот фрагмент. Идея состоит в том, чтобы поместить все элементы меньше, чем размер элемента data, деленный на 2. Чтобы вычислить это, мы используем фильтр length. Теперь для получения индекса текущего элемента мы используем loop.index. И, наконец, мы * помещаем ассоциативный элемент в левый или правый массив. Ассоциативный массив состоит из двух компонентов key и value. Чтобы ссылаться на ключ массива в twit, мы используем оператор () и используем фильтр merge для вставки в массив, как показано здесь {% set left_list = left_list|merge({ (key): value }) %}

Это полное решение.

{% set left_list = {} %}
{% set right_list = {} %}
{% set limit = data|length // 2 %}
{% for key, value in data|cast_to_array %}
{% if key != 'password' %}
{% if loop.index <= limit %}
{% set left_list = left_list|merge({ (key): value }) %}
{% else %}
{% set right_list = right_list|merge({ (key): value }) %}
{% endif %}
{% endif %}
{% endfor %}
{% for key, value in left_list %}
<p>
<label for="{{key}}">{{key}}</label>
<input type="text" name="{{key}}" id="{{key}}" value="{{value}}"
       class="text ui-widget-content ui-corner-all">
</p>
{% endfor %}
0 голосов
/ 23 июня 2016

У меня был многомерный массив.Единственное решение, которое я смог найти, - это создать новый временный массив и обновить / добавить информацию, которая затем была передана другой функции ветки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...