Лучший способ справиться с этим - преобразовать данные внутри контроллера. Это потому, что с фильтром 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>
демо