代码之家  ›  专栏  ›  技术社区  ›  yozawiratama

将关键字值转换为细枝中的矩阵

  •  1
  • yozawiratama  · 技术社区  · 8 年前

    我用细枝把数据渲染成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 回复  |  直到 8 年前
        1
  •  4
  •   DarkBee    8 年前

    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