Câu trả lời:
Không có cách nào hay để làm điều này trong Twig. Tuy nhiên, có thể bằng cách sử dụng bộ lọc hợp nhất:
{% set arr = arr|merge({'element': 'value'}) %}
.
và []
rất giống nhau trong Twig và tôi đã sai. Tôi nhìn nó và chỉnh sửa câu trả lời của tôi.
'element'
. Tôi tìm thấy câu trả lời của @ LivaX bên dưới. Vì vậy, nó sẽ được {% set arr = arr|merge({(key): 'value'}) %}
.
{{ UI.button({'type':'submit'}) }}
và tất cả các macro này sử dụng | merge để đặt tham số mặc định, do đó cần có logic cho việc này ...
Tôi gặp vấn đề này nhưng đã cố gắng tạo các chỉ mục nguyên thay vì chỉ mục liên kết như 'phần tử'.
Bạn cũng cần bảo vệ khóa chỉ mục của mình bằng ()
cách sử dụng bộ lọc hợp nhất:
{% set arr = arr|merge({ (loop.index0): 'value'}) %}
Bây giờ bạn có thể thêm khóa chỉ mục tùy chỉnh như ('element'~loop.index0)
Nếu khởi tạo chỉ cần:
{% set items = { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'unknown' } %}
Tôi đã thử câu trả lời của @LivaX nhưng nó không hoạt động, hợp nhất một mảng trong đó các khóa là số không hoạt động ( https://github.com/twigphp/Twig/issues/789 ).
Điều đó sẽ chỉ hoạt động khi các phím là chuỗi
Những gì tôi đã làm là tạo lại một bảng khác ( temp
) từ bảng ban đầu ( t
) và tạo các khóa thành một chuỗi, ví dụ:
{% for key , value in t%}
{% set temp= temp|merge({(key~'_'):value}) %}
{% endfor %}
t
các phím: 0, 1, 2 ..
temp
các phím: 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'%}
Cảm ơn chủ đề này - Tôi cũng có thể tạo một mảng với (loop.index0) và gửi đến twig.
Tôi thấy vấn đề này rất khó chịu và giải pháp của tôi có lẽ là chính thống và không phù hợp với triết lý Twig, nhưng tôi đã phát triển như sau:
$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);
có thể được sử dụng như sau:
{% set Array = set_element (mảng, 'phần tử', 'value')%}
Chỉ cần sử dụng như thế này {% set arr={'key':'value'} %}
(không có khoảng trống sau :
), nó hoạt động tốt.
Nhưng khi tôi sử dụng nó trong một vòng lặp for, để biến nó thành một mảng, nó không hoạt động bên ngoài phạm vi 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
Tôi đã có vấn đề này một thời gian trước đây. Hãy tưởng tượng bạn có một mảng như thế này:
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'
}
Vì vậy, bạn muốn hiển thị dữ liệu này thành hai hàng, nhưng xóa mật khẩu khỏi danh sách đó. Để kết thúc này, việc chia thành 2 mảng sẽ dễ dàng với slice
bộ lọc. Tuy nhiên, chúng tôi phải xóa mật khẩu. Vì lý do đó, tôi đang sử dụng đoạn trích này. Ý tưởng là đặt tất cả các phần tử nhỏ hơn data
kích thước phần tử chia cho 2. Để tính toán điều này, chúng tôi sử dụng bộ lọc length
. Bây giờ để có được chỉ số của các yếu tố hiện tại chúng tôi sử dụng loop.index
. Và cuối cùng chúng tôi * đẩy một yếu tố kết hợp trong mảng bên trái hoặc bên phải. Một mảng kết hợp có hai thành phần key
và value
. Để tham chiếu một khóa mảng trong twit chúng ta toán tử ()
và chúng ta sử dụng merge
bộ lọc để đẩy vào mảng như được hiển thị ở đây{% set left_list = left_list|merge({ (key): value }) %}
Đây là giải pháp hoàn chỉnh.
{% 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 %}