TWIG排序数据通用键



我最近开始使用twig,现在我面临的问题是我想根据多个通用键对数组进行分组。

我的当前数组是这样的:(JSON风格)

{
"attribute_groups": [
{
"attribute_group_id": "1",
"name": "Atribute Group #1",
"attribute": [
{
"attribute_id": "101",
"name": "Attrib1",
"value": "Val1",
"subgroup": "SubGroup A"
},
{
"attribute_id": "102",
"name": "Attrib2",
"value": "Val2",
"subgroup": "SubGroup B"
},
{
"attribute_id": "103",
"name": "Attrib3",
"value": "Val3",
"subgroup": "SubGroup A"
},
{
"attribute_id": "104",
"name": "Attrib4",
"value": "Val4",
"subgroup": "SubGroup B"
}
]
},
{
"attribute_group_id": "2",
"name": "Atribute Group #2",
"attribute": [
{
"attribute_id": "201",
"name": "Attrib5",
"value": "Val5",
"subgroup": "SubGroup A"
},
{
"attribute_id": "202",
"name": "Attrib6",
"value": "Val6",
"subgroup": "SubGroup C"
},
{
"attribute_id": "203",
"name": "Attrib7",
"value": "Val7",
"subgroup": "SubGroup A"
},
{
"attribute_id": "204",
"name": "Attrib8",
"value": "Val8",
"subgroup": "SubGroup C"
}
]
}
]
}

使用基本的twig for loop,我可以

{% for attribute_group in attribute_groups %}
This is group: {{ attribute_group.name }}
{% for attribute in attribute_group.attribute %}
Attribute {{ attribute.name }} has value: {{ attribute.value }}
{% endfor %}
{% endfor %}

输出将显示按主组分组的属性:

This is group: Atribute Group #1
Attribute Attrib1 has value: Val1
Attribute Attrib2 has value: Val2
Attribute Attrib3 has value: Val3
Attribute Attrib4 has value: Val4
This is group: Atribute Group #2
Attribute Attrib5 has value: Val5
Attribute Attrib6 has value: Val6
Attribute Attrib7 has value: Val7
Attribute Attrib8 has value: Val8

As twigfiddle: https://twigfiddle.com/cow2ax

现在我想有一个额外的子分组"subgroup"关键:

This is group: Atribute Group #1
SubGroup A has attribues:
Attribute Attrib1 has value: Val1
Attribute Attrib3 has value: Val3
SubGroup B has attribues:
Attribute Attrib2 has value: Val2
Attribute Attrib4 has value: Val4
This is group: Atribute Group #2
SubGroup A has attribues:
Attribute Attrib5 has value: Val5
Attribute Attrib7 has value: Val7
SubGroup C has attribues:
Attribute Attrib6 has value: Val6
Attribute Attrib8 has value: Val8

如何实现这种子排序/子分组?

我发现如何在HTML表的一行中添加相同名称的值,但我不能围绕它来包装我的大脑:|

免责声明

如前所述,在链接的答案中已经提到,这些都是不应该在twig本身中完成的事情。最好将这个逻辑移到控制器中,或者至少使用一个分支扩展,这样你就可以更容易地对你想要的一切进行分组。

关于为什么不应该在模板中这样做的更多信息可以在这里找到


这是为您的分组重新编写的代码片段。我已经在链接的问题中给出了我的两点意见,所以如果你想了解更多关于这个片段如何工作的细节,请阅读这些问题/答案

{% set subgroups = {} %}
{% for attribute_group in attribute_groups %}
{% set subgroups = subgroups|merge({ ('_'~attribute_group.attribute_group_id): {},}) %}

{% for attribute in attribute_group.attribute %}
{% if not subgroups['_'~attribute_group.attribute_group_id][attribute.subgroup] is defined %}
{% set subgroups = subgroups|merge({
('_'~attribute_group.attribute_group_id): subgroups['_'~attribute_group.attribute_group_id]|merge({(attribute.subgroup):{},}),
}) %}                
{% endif %}

{% set subgroups = subgroups|merge({
('_'~attribute_group.attribute_group_id): subgroups['_'~attribute_group.attribute_group_id]|merge({(attribute.subgroup): subgroups['_'~attribute_group.attribute_group_id][attribute.subgroup]|merge([ attribute, ]),}),
}) %}         
{% endfor %}
{% endfor %}

{% for attribute_group in attribute_groups %}
{{ attribute_group.name }}

{% for key, attributes in subgroups['_'~attribute_group.attribute_group_id] %}
{{ key }}
=============        
{% for attribute in attributes %}
{{ attribute.value }}
{% endfor %}
=============
{% endfor %}
{% endfor %}

演示

最新更新