首页 > 解决方案 > 按给定日期的日期对 Twig 数组进行排序

问题描述

我想nextbirthdays按给定的日期值对数组 ( ) 进行排序。与仅订购日期本身不同,我想按给定的日期排序。在这种情况下,我想显示用户的生日。给出的数据集仅包含生日为今天加上 7 天的用户。

数据集本身可能看起来像这样:

 Birthday     | Username
--------------+-----------
 01. Apr 1953 | User 1         
 04. Apr 1970 | User 2
 02. Apr 1992 | User 3
 02. Apr 2002 | User 4
 01. Apr 1993 | User 5

使用nextbirthdays|sorttwig 正确排序日期(按最新到最旧或相反)但我想按实际日期排序,然后是月份,然后是日期的年份。

 Birthday     | Username
--------------+-----------
 01. Apr 1993 | User 5      
 01. Apr 1953 | User 1
 02. Apr 2002 | User 4
 02. Apr 1992 | User 3
 04. Apr 1970 | User 2

原始代码:

<ul>
{% for nextbd in nextbirthdays %}
    <li><span class="text-muted mr-3">{{ nextbd.birthday|date("d. M Y") }}: </span>

    {% if nextbd.birthday|date("d.m") == "now"|date("d.m") %}
        <b>{{ nextbd.firstname }} {{ nextbd.lastname }}</b>
    {% else %}
        {{ nextbd.firstname }} {{ nextbd.lastname }}
    {% endif %}

{% endfor %}
</ul>

排序和映射:

当尝试使用以下语句从树枝调整排序功能时,生日不再出现。

{% for nextbd in nextbirthdays|sort((a, b) => a.birthday <=> b.birthday)|column('birthday') %}
    <!-- rest of the code is unchanged -->
{% endfor %}

标签: sortingtwig

解决方案


您的代码中确实有两个问题:

  1. |column('birthday'):使用此过滤器,您将数组限制为birthday仅列,因此您将不再获得名字或姓氏。
  2. 您的要求比您想象的要复杂:
    • 01. Aprsorted before02. Apr表示您正在对日期和月份进行升序排序
    • 01. Apr 1993sorted before01. Apr 1953表示您正在对年份进行降序排序

所以,你的条件应该是:

a.birthday|date('dm') > b.birthday|date('dm') or (a.birthday|date('dm') == b.birthday|date('dm') and a.birthday|date('Y') < b.birthday|date('Y'))

给出一个 for 循环:

{% for nextbd in nextbirthdays|sort((a, b) => a.birthday|date('dm') > b.birthday|date('dm') or (a.birthday|date('dm') == b.birthday|date('dm') and a.birthday|date('Y') < b.birthday|date('Y'))) %}
  {# rest of the code is unchanged #}
{% endfor %}

这可以在这里测试:https ://twigfiddle.com/of3cbi


推荐阅读