Ответ 1
В Twig нет хорошего способа сделать это. Это возможно, однако, используя фильтр слияния:
{% set arr = arr|merge({'element': 'value'}) %}
Как установить член уже существующего массива из Twig?
Я попытался сделать это следующим образом:
{% set arr['element'] = 'value' %}
но я получил следующую ошибку:
Неожиданный токен "пунктуация" значения "[" ( "конец блока оператора" ожидаемый) в...
В Twig нет хорошего способа сделать это. Это возможно, однако, используя фильтр слияния:
{% set arr = arr|merge({'element': 'value'}) %}
Я столкнулся с этой проблемой, но пытался создать целочисленные индексы вместо ассоциативного индекса, например "element".
Вам необходимо защитить свой индексный ключ с помощью ()
с помощью фильтра слияния:
{% set arr = arr|merge({ (loop.index0): 'value'}) %}
Теперь вы можете добавить собственный индексный ключ, например ('element'~loop.index0)
Если инициализация нужна только:
{% set items = { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'unknown' } %}
Просто используйте это как {% 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
Спасибо за внимание. (плохой английский, извините!)
{% 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) и отправить на ветку.
Я пробовал ответ @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_....
Я нашел эту проблему очень раздражающей, и мое решение, возможно, является ортодоксальным и не связано с философией 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')%}
У меня был массив с несколькими измерениями. Единственное решение, которое я смог найти, - создать новый временный массив и обновить/добавить информацию, которая была передана другой функции твига.
У меня была эта проблема некоторое время назад. Представьте, что у вас есть такой массив:
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 %}
Вы также можете использовать следующий синтаксис:
{% set myArray = myArray + myArray2 %}