我使用树枝将数据呈现为html。我从服务器获得的数据是键值。例如:
replaceregexp
我需要像这样将数据呈现到表中:
| Key | Value |
|-----|-------|
| A | 1 |
| A | 2 |
| B | |
| C | 10 |
这是我尝试过的:
| A | B | C |
|---|---|----|
| 1 | 0 | 10 |
| 2 | 0 | 0 |
但这仍然是错误的,它将呈现:
<table>
<thead>
<tr>
{% set now = '' %}
{% set arrKey = [] %}
{% for data in datas %}
{% if now != data.key %}
<th>{{ data.key }}</th>
{% set now = data.key %}
{% else %}
{% set arrKey = arrKey|merge([now]) %}
{% endif %}
{% endfor %}
</tr>
</thead>
<tbody>
{% set rowNow = '' %}
{% for key in arrKey %}
<tr>
{% for data in datas %}
{% if rowNow != dataKey %}
{% if data.value is empty %}
<td>0</td>
{% else %}
<td>{{ data.value }}</td>
{% endif %}
{% set rowNow = data.key %}
{% endif %}
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
请帮助我如何解决这个问题?
答案 0 :(得分:4)
管理此问题的最佳方法是在控制器内部转换数据。这是因为merge
过滤器很难使用。无论如何,如果您想纯粹地twig
来做,这就是
{% set data = [
{ 'key': 'A', 'value': 1, },
{ 'key': 'A', 'value': 2, },
{ 'key': 'B', 'value': null, },
{ 'key': 'C', 'value': 2, },
{ 'key': 'C', 'value': 4, },
{ 'key': 'A', 'value': 3, },
{ 'key': 'A', 'value': 4, },
] %}
{% set temp = [] %}
{% for row in data %}
{% if not (row.key in temp|keys) %}
{% set temp = temp | merge({ (row.key) : [] }) %}
{% endif %}
{% set temp = temp | merge({(row.key):(temp[row.key]|merge([ row.value, ]))}) %}
{% endfor %}
{% set max = 0 %}
{% for data in temp %}{% if data|length > max %}{% set max = data|length %}{% endif %}{% endfor %}
<table>
<tr>
{% for key in temp|keys %}
<th>{{ key }}</th>
{% endfor %}
</tr>
{% for i in 0..(max-1) %}
<tr>
{% for data in temp %}
<td>{{ data[i] | default(0) }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>