Элемент настройки массива от Twig

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

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

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

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

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

Ответ 1

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

{% set arr = arr|merge({'element': 'value'}) %}

Ответ 2

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

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

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

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

Ответ 3

Если инициализация нужна только:

{% set items = { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'unknown' } %}

Ответ 4

Просто используйте это как {% 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

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

Ответ 5

{% 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) и отправить на ветку.

Ответ 6

Я пробовал ответ @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_....

Ответ 7

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

$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')%}

Ответ 8

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

Ответ 9

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

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, мы используем operator () и используем фильтр merge для {% set left_list = left_list|merge({ (key): value }) %} в массив, как показано здесь {% 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 %}

Ответ 10

Вы также можете использовать следующий синтаксис:

{% set myArray = myArray + myArray2 %}