답변:
Twig에서이 작업을 수행하는 좋은 방법은 없습니다. 그러나 병합 필터를 사용하면 가능합니다.
{% set arr = arr|merge({'element': 'value'}) %}
.
그리고 []
Twig에서 매우 유사하고 나는 틀 렸습니다. 나는 그것을 찾아 내 대답을 편집했습니다.
'element'
. 아래에서 @LivaX의 답변을 찾았습니다. 따라서 {% set arr = arr|merge({(key): 'value'}) %}
.
{{ UI.button({'type':'submit'}) }}
이 모든 매크로 사용 | 기본 PARAMS을 설정하기위한 병합, 그래서 이것에 대한 논리적 필요 ...이
이 문제가 발생했지만 '요소'와 같은 연관 인덱스 대신 정수 인덱스를 만들려고했습니다.
()
병합 필터를 사용 하여 색인 키를 보호해야합니다 .
{% set arr = arr|merge({ (loop.index0): 'value'}) %}
이제 다음과 같은 사용자 지정 색인 키를 추가 할 수 있습니다. ('element'~loop.index0)
초기화 만 필요한 경우 :
{% set items = { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'unknown' } %}
@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_ ....
{% 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)으로 배열을 만들고 나뭇 가지로 보낼 수있었습니다.
저는이 문제가 매우 성가신 문제를 발견했으며 제 해결책은 아마도 정통적이고 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') %}
다음과 같이 사용 {% 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 does not work, saying title is not defined
나는 언젠가이 문제가 있었다. 다음과 같은 배열이 있다고 상상해보십시오.
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'
}
따라서이 데이터를 두 행에 표시하고 싶지만 해당 목록에서 암호를 제거하십시오. 이를 위해 slice
필터를 사용하면 2 개의 배열로 쉽게 분할 할 수 있습니다 . 그러나 암호를 제거해야합니다. 이러한 이유로 저는이 스 니펫을 사용하고 있습니다. 아이디어는 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 %}