Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 数据提供者日期排序_Php_Sorting_Gridview_Yii2_Dataprovider - Fatal编程技术网

Php 数据提供者日期排序

Php 数据提供者日期排序,php,sorting,gridview,yii2,dataprovider,Php,Sorting,Gridview,Yii2,Dataprovider,我拥有DateTime-birthdate类型字段的ArrayDataProvider。 我将该数据提供程序用于视图部分中的gridview 由于出生日期包括出生年份,因此排序未按预期进行。 有没有办法告诉排序机制不要计算年份,而只按月份和日期排序?可能是自定义排序功能 > >编辑: C++中的“代码>排序/,在这里你可以通过比较函数。 编辑的当前解决方案说明: 我目前的解决方案是将生日作为一个单独的字段包含在数组中,并将生日的年份设置为当前年份。现在的日期是同一年,分拣工作。但是,将出生年份

我拥有DateTime-birthdate类型字段的ArrayDataProvider。 我将该数据提供程序用于视图部分中的gridview

由于出生日期包括出生年份,因此排序未按预期进行。 有没有办法告诉排序机制不要计算年份,而只按月份和日期排序?可能是自定义排序功能

<> > >编辑: C++中的“代码>排序/<代码>,在这里你可以通过比较函数。 编辑的当前解决方案说明: 我目前的解决方案是将生日作为一个单独的字段包含在数组中,并将生日的年份设置为当前年份。现在的日期是同一年,分拣工作。但是,将出生年份单独列为一个字段并不合适。我希望我能从一个日期对象获得所有必要的数据

这单独的领域磨我的齿轮。这并不完美

编辑: 哦,是的

更新 还有一个PHP数组排序函数,它接受比较回调,例如uasort,可用于像我这样的关联数组:

uasort($persons, function($a, $b){
    return strcasecmp( $b['date']->format('m-d'), $a['date']->format('m-d') );
});

现在我需要找到将其实现到ArrayDataProvider中的方法。有什么想法吗

你应该试试这样的东西

use yii\db\Expression;
$dataProvider->setSort([
            'attributes' => [
................................
                'birthday' => [
                    'asc' => [
                        new Expression('DATE_FORMAT(birthday, "%m%d")') => SORT_ASC, 
                    ],
                    'desc' => [
                        new Expression('DATE_FORMAT(birthday, "%m%d")') => SORT_DESC, 
                    ],
                    'label' => 'Birthday',
                    'default' => SORT_ASC
                ],
................................
            ]
        ]);
我没有试过这个

这样做肯定有效

$query->select([
                    new Expression('DATE_FORMAT(birthday, "%m%d") as show_date'), 
      .................................
                ]);
然后


如果您有一个数组数据提供程序,您当然不能使用数据库排序

使用Yii的解决方案 要允许按某个表达式排序,必须事先计算值,并将属性的排序配置为使用计算值而不是原始值:

// assuming $data contains your data and 'birthdate' is the value you want to use for sorting

foreach($data as $key => $value) {
    $data[$key]['sort_birthdate'] = date('m-d', strtotime($value['birthdate']));
}
$dataProvider = new \yii\data\ArrayDataProvider([
    'allModels' => $data,
    'sort' => [
        'attributes' => [
            'birthdate' => [
                'asc' => [
                    'sort_birthdate' => SORT_ASC, 
                ],
                'desc' => [
                    'sort_birthdate' => SORT_DESC, 
                ],
                'label' => 'Date',
                'default' => SORT_ASC
            ],
            // list all other attributes here
        ],
    ]
]);
扩展Yii的解决方案 如果需要自定义比较函数,则必须扩展Yii类以支持此功能。
您可以创建一个自定义的
ArrayDataProvider
类,该类从Yii附带的类扩展而来,并覆盖-method。

请发布您的代码。我认为这里没有任何代码的用途。您可以在ArrayDataProvider或任何数据提供程序上设置自定义排序吗?我想如果数据来自数据库,它会起作用。我的数据来自数据库,但在我可以显示给人类消费之前,必须做好准备。所以很遗憾,我不能使用SQL对日期进行排序。获取数组,根据需要在其中创建一个包含数据的字段(在本例中为月日),并将其用作排序属性。在GridView中使用ArrayDataProvider。是的,这是我的问题-排序工作所需的额外字段。但是我可以用回调或smth钩住该字段的实际排序吗?比较函数回调。为什么这是一个问题?它是数组中的一个字段。遍历数组,向其中添加一个新字段。。使用阵列数据提供程序中的字段。你说你已经准备好了。。。在你的“准备”中也加上这个。我知道了,你已经这样做了,但是你不喜欢这个解决方案。很抱歉,我没有其他想法,但我知道您正在尝试做什么。这几乎就是ArrayDataProvider对象获取数据之前所做的。我将对问题补充澄清意见。谢谢。Yii不支持这一点。更新了我的答案,以显示如何扩展Yii以添加此内容。我将很快进行研究。看起来很有希望,但最终的开销可能会超过我的简单应用程序所需的开销。将是一个很好的学习。非常感谢您的时间。顺便说一句,当面临同样的问题时,任何人都知道您可能走错了方向。在我看来,Yii确实可以通过设计解决很多问题,而在我看来,所有问题都是通过发现“虚拟属性”(初学者错误)来解决的。现在一切都很完美:)好吧,你根本没有提到你正在使用AR
// assuming $data contains your data and 'birthdate' is the value you want to use for sorting

foreach($data as $key => $value) {
    $data[$key]['sort_birthdate'] = date('m-d', strtotime($value['birthdate']));
}
$dataProvider = new \yii\data\ArrayDataProvider([
    'allModels' => $data,
    'sort' => [
        'attributes' => [
            'birthdate' => [
                'asc' => [
                    'sort_birthdate' => SORT_ASC, 
                ],
                'desc' => [
                    'sort_birthdate' => SORT_DESC, 
                ],
                'label' => 'Date',
                'default' => SORT_ASC
            ],
            // list all other attributes here
        ],
    ]
]);