Twig 按字段对对象数组进行细枝排序

Twig 按字段对对象数组进行细枝排序,twig,Twig,我有一个带有字段的实体: 用户 名字 姓氏 年龄 还有一些。使用用户对象将Im发送到细枝阵列 在表中的细枝中显示用户: {% for user in users %} <td>{{ user.name }}<td> <td>{{ user.lastname}}<td> <td>{{ user.age}}<td> {% endfor %} {users%]中的用户的% {{user.name}{{user.

我有一个带有字段的实体:

用户

  • 名字
  • 姓氏
  • 年龄
还有一些。使用用户对象将Im发送到细枝阵列

在表中的细枝中显示用户:

 {% for user in users %}
     <td>{{ user.name }}<td> <td>{{ user.lastname}}<td> <td>{{ user.age}}<td>
 {% endfor %}
{users%]中的用户的%
{{user.name}{{user.lastname}{{user.age}
{%endfor%}

如何在Twig中通过name或lastname等对用户进行排序。我想创建可排序表。

您必须在模型中使用“ORDERBY”子句来完成此操作。但是,如果您想拥有一个可以动态排序的表,那么应该关注jQuery tablesorter插件(如果您不想使用jQuery,则可以使用等效插件)


不可能按特定字段在开箱即用的细枝中排序。 您可以在twig中使用PHP asort按id排序,twig将是
|sort
过滤器,或者您可以编写一个定制的twig扩展来满足您的需要

{% for user in users|sort %}
    ...
{% endfor %}
并使用|反转过滤器反转顺序

{% for user in users|reverse(true) %}
    ...
{% endfor %}

是,您可以添加自定义筛选器:

{% for user in users|usort %}
    ...
{% endfor %}
然后将扩展/新过滤器添加到细枝:

new\Twig\u SimpleFilter('usort',array($this,'usortFilter'))

公共函数usortFilter($item){
usort($item,function($item1,$item2){
如果($item1['orderNo']=$item2['orderNo'])返回0;
返回$item1['orderNo']<$item2['orderNo']?-1:1;
});
返回$item;
}

按相反顺序排序:

{% for user in users|sort|reverse %}
    ...
{% endfor %}
排序和反转是可组合的。

从Twig 2.12(2019年10月5日发布)开始,您可以在
arrow
参数中使用带有箭头函数的
排序
过滤器

例如,要按名称订购:

{% for user in users|sort((a, b) => a.name <=> b.name) %}
    <td>{{ user.name }}</td> <td>{{ user.lastname}}</td> <td>{{ user.age}}</td>
{% endfor %}
{%for user in users | sort((a,b)=>a.name b.name)%}
{{user.name}{{user.lastname}{{user.age}
{%endfor%}
Twig docs:

对于那些使用Twig docs的用户,您只需执行以下操作:

{% for user in users.order("name", "asc") %}
     ...
{% endfor %}
当然,
name
可以是给定对象的任何属性,
asc
也可以是
desc

这也适用于点连接特性:

{% for child in page.children.order("page.headers.foo.bar", "desc") %}

使用新版本的twig,您可以按colonne排序

{% set fruits = [
{ name: 'Apples', quantity: 5 },
{ name: 'Oranges', quantity: 2 },
{ name: 'Grapes', quantity: 4 },] %}
{% for fruit in fruits|sort((a, b) => a.quantity <=> b.quantity)|column('name') %}
    {{ fruit }}
{% endfor %}
{%set水果=[
{名称:'苹果',数量:5},
{名称:'橙子',数量:2},
{名称:'葡萄',数量:4},]%}
{水果中水果的百分比|排序((a,b)=>a.quantity b.quantity)|列('name')%}
{{水果}
{%endfor%}

我正在使用Wordpress的Timber,它仍然使用Twig 1+,因此我无法使用arrow参数。我刚刚使用PHP的usort函数创建了一个如下过滤器:

//按参数对对象数组排序
$twig->addFilter(新的twig\u SimpleFilter('sort\u by\u key',
函数($array,$key,$order='asc',$type='string'){
usort($array,function($a,$b)use($key,$order,$type){
$a=$a[$key];$b=$b[$key];
如果($type=='date'){
$a=标准时间($a);
$b=标准时间($b);
}
如果($a=$b){
返回0;
}
交换机($订单){
案例“desc”:案例“desc”:
返回$a<$b?1:-1;
打破
违约:
返回$a<$b?-1:1;
}
}  );
返回$array;
}));
然后在我的小树枝模板中:

{%set array=myArrayOfObjects |按_键('date','desc','date')%排序}

与高级自定义字段repeater字段配合良好。

我认为这不是twig的任务。您应该在控制器(或模型,可能更好)中对它们进行排序,并将已排序的列表传递给twig.Yes。这并不是针对模板的。1.您说您有两个实体字段,这表明您从数据库中获得了列表。当您提出请求时,请在查询中设置排序。我知道这是一个旧Q/A,但万一有人在这里闲逛,我不久前创建了这个自定义筛选器:当我使用此代码时,我得到了
非法字符串偏移量'orderNo'
。@JeremyJohn,因为您的数组中没有
orderNo
。如何将筛选器添加到twig?太棒了,最优雅最简单的解决方案,对我来说就像一种魅力。我认为这应该是公认的答案。对于那些想知道是什么的人,你知道如何进行多字段排序吗?e、 g.对年龄描述进行排序,然后命名为asc?@biko
| sort((a,b)=>a.age b.age?:a.name b.name)
这应该有效。如果你想从asc切换到desc(或其他方式),只需将a与b切换。我希望在阅读所有其他内容之前看到这一点。同样适用于十月CMS!
{% set fruits = [
{ name: 'Apples', quantity: 5 },
{ name: 'Oranges', quantity: 2 },
{ name: 'Grapes', quantity: 4 },] %}
{% for fruit in fruits|sort((a, b) => a.quantity <=> b.quantity)|column('name') %}
    {{ fruit }}
{% endfor %}