답변:
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 %}