在枝中将键值转换为矩阵

时间:2018-07-06 07:20:42

标签: php symfony twig

我使用树枝将数据呈现为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>

请帮助我如何解决这个问题?

1 个答案:

答案 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>

demo