Twig에서 배열의 설정 요소


126

Twig에서 이미 존재하는 어레이의 구성원을 어떻게 설정할 수 있습니까?

다음 방법으로 시도했습니다.

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

하지만 다음과 같은 오류가 발생했습니다.

...에서 값 "["( "명령문 블록의 끝"예상 됨)의 예기치 않은 토큰 "구두점"

답변:


211

Twig에서이 작업을 수행하는 좋은 방법은 없습니다. 그러나 병합 필터를 사용하면 가능합니다.

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

"."-문은 "[]"와 같으므로 해결책이 아닙니다
falinsky

@falinsky 당신이 맞아요. .그리고 []Twig에서 매우 유사하고 나는 틀 렸습니다. 나는 그것을 찾아 내 대답을 편집했습니다.
Paul

17
대신 동적 변수 키를 정의하는 방법을 찾고있었습니다 'element'. 아래에서 @LivaX의 답변을 찾았습니다. 따라서 {% set arr = arr|merge({(key): 'value'}) %}.
Sithu 2015

이것은 너무 어리석은 일입니다. Twig가 배열 값을 설정하는 기능을 허용하지 않는 이유는 무엇입니까?
Matt Cavanagh

1
@MattCavanagh보기 파일 (예 : Twig)에는 비즈니스 로직이 포함되어 있지 않기 때문에 궁극적으로 모델에서 처리해야합니다. 뷰는 실제로 거기에있는 것을 단순히 렌더링해야합니다. 제 경우에 문제는 내가 또한 당신에게 동의하는 이유는 UI 객체를 렌더링하기 위해 나뭇 가지 매크로를 만드는 것입니다. {{ UI.button({'type':'submit'}) }}이 모든 매크로 사용 | 기본 PARAMS을 설정하기위한 병합, 그래서 이것에 대한 논리적 필요 ...이
Prof83

80

이 문제가 발생했지만 '요소'와 같은 연관 인덱스 대신 정수 인덱스를 만들려고했습니다.

()병합 필터를 사용 하여 색인 키를 보호해야합니다 .

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

이제 다음과 같은 사용자 지정 색인 키를 추가 할 수 있습니다. ('element'~loop.index0)


LivaX 덕분에 키를 동적으로 삽입하려고 할 때 이것이 실제 솔루션입니다!
nicolallias

19

초기화 만 필요한 경우 :

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

9
이것은 질문이 아닙니다.
redreinard

2

@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_ ....


같은 문제, 지금까지 해결책이 없습니다.
TyrionGraphiste

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)으로 배열을 만들고 나뭇 가지로 보낼 수있었습니다.


1

저는이 문제가 매우 성가신 문제를 발견했으며 제 해결책은 아마도 정통적이고 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') %}


1

다음과 같이 사용 {% 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

1
for 루프 외부에서 변수를 사용하려면 for 루프 외부에서 정의해야합니다. 여기를 참조하십시오. twig.sensiolabs.org/doc/tags/set.html
user2019515

5
이것은 모든 종류의 잘못입니다. 콜론 뒤의 공백은 중요하지 않습니다. 질문이었던 배열의 요소를 설정하지 않고 새 배열을 만들고 있습니다. {{array}}와 같은 배열은 출력 할 수 없으며 오류가 발생합니다. 이 대답은 실패로 가득 차 있으며 질문과 관련이 없습니다.
redreinard

3
이 upvotes을 가지고 왜 위에서 언급 한 것처럼 ..., 거의 모든이 "답"에서 잘못 이해하지 않는
MariusJP

0

다차원 배열이 있습니다. 내가 알아낼 수있는 유일한 해결책은 새로운 임시 배열을 만들고 정보를 업데이트 / 추가 하는 것입니다.이 정보는 다른 twig 함수에 추가로 전달되었습니다.


0

나는 언젠가이 문제가 있었다. 다음과 같은 배열이 있다고 상상해보십시오.

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. 그리고 마지막으로 우리는 왼쪽 또는 오른쪽 배열에 연관 요소를 밀어 넣습니다. 연관 배열에는 keyvalue. 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

다음 구문을 사용할 수도 있습니다.

{% set myArray = myArray + myArray2 %}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.