首页 > 解决方案 > 将键值转换为树枝中的矩阵

问题描述

我使用 twig 将数据呈现为 html。我从服务器获得的数据是一个键值。例如 :

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

但这仍然是错误的,它将呈现:

| A | B | C  |
|---|---|----|
| 1 | 0 | 10 |
| 1 | 0 | 10 |

请帮我解决这个问题?

标签: phpsymfonytwig

解决方案


管理此问题的最佳方法是转换控制器内部的数据。这是因为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>

演示


推荐阅读