Twig按字段排序对象数组

时间:2014-08-08 00:44:20

标签: twig

我有字段实体:

用户

  • 姓名
  • 姓氏
  • 年龄

还有更多。我发送给具有对象用户的Twig数组。

在表格中的树枝显示用户中:

 {% for user in users %}
     <td>{{ user.name }}<td> <td>{{ user.lastname}}<td> <td>{{ user.age}}<td>
 {% endfor %}

如何在Twig中通过名称或姓氏等对用户进行排序。我想创建可排序表。

8 个答案:

答案 0 :(得分:15)

是的,您可以添加自定义过滤器:

{% for user in users|usort %}
    ...
{% endfor %}

然后将扩展/新过滤器添加到Twig:

new \Twig_SimpleFilter('usort', array($this, 'usortFilter'))

public function usortFilter($item){
    usort($item, function ($item1, $item2) {
        if ($item1['orderNo'] == $item2['orderNo']) return 0;
        return $item1['orderNo'] < $item2['orderNo'] ? -1 : 1;
    });

    return $item;
}

答案 1 :(得分:3)

从Twig 2.12(于2019年10月5日发布)开始,您可以在sort参数中使用带有箭头功能的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 %}

嫩枝文档:https://twig.symfony.com/doc/2.x/filters/sort.html

答案 2 :(得分:2)

按相反顺序排序:

{% for user in users|sort|reverse %}
    ...
{% endfor %}

排序和反转是可以组合的。

答案 3 :(得分:0)

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

http://tablesorter.com/docs/

答案 4 :(得分:0)

对于使用Collections in Grav的用户,您只需执行以下操作:

{% for user in users.order("name", "asc") %}
     ...
{% endfor %}

当然,name可以是给定对象的任何属性,asc可以是desc

这也适用于点连接属性:

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

答案 5 :(得分:0)

使用新版本的树枝,您可以按冒号排序

{% 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 %}

https://twig.symfony.com/doc/2.x/filters/sort.html

答案 6 :(得分:0)

我使用的是Timber for Wordpress,仍然使用Twig 1+,所以我不能使用arrow参数。我刚刚使用PHP的usort函数创建了这样的过滤器:

// sort an array of objects by parameter
$twig->addFilter( new Twig_SimpleFilter( 'sort_by_key', 
    function ( $array, $key, $order = 'asc', $type = 'string' ) {
        usort( $array, function($a, $b) use ($key, $order, $type) {
        $a = $a[$key]; $b = $b[$key];
        if( $type === 'date' ) {
            $a = strtotime( $a );
            $b = strtotime( $b );
        }
        if( $a == $b ) {
            return 0;
        }
        switch( $order ) {
            case 'desc' : case  'DESC' :
                return $a < $b ?  1 : -1;
                break;
            default :
                return $a < $b ?  -1 : 1;
        }
        }  );
        return $array;
    }));

然后在我的树枝模板中

    {% set array = myArrayOfObjects | sort_by_key('date', 'desc', 'date') %}

与“高级自定义字段”转发器字段配合使用。

答案 7 :(得分:-2)

根据特定领域的订单,开箱即用的树枝是不可能的。 你可以在twig中使用PHP asort对|sort过滤器进行排序,或者你可以编写一个自定义的枝条扩展来完成你需要的工作。

{% for user in users|sort %}
    ...
{% endfor %}

并使用| reverse filter

反转顺序
{% for user in users|reverse(true) %}
    ...
{% endfor %}