Преобразовать значение ключа в матрицу в ветке - PullRequest
0 голосов
/ 06 июля 2018

Я использовал веточку для рендеринга данных в 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 |

Пожалуйста, помогите мне, как решить эту проблему?

1 Ответ

0 голосов
/ 06 июля 2018

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

демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...