Php 数据提供者日期排序
我拥有DateTime-birthdate类型字段的ArrayDataProvider。 我将该数据提供程序用于视图部分中的gridview 由于出生日期包括出生年份,因此排序未按预期进行。 有没有办法告诉排序机制不要计算年份,而只按月份和日期排序?可能是自定义排序功能 <> > >编辑: C++中的“代码>排序/<代码>,在这里你可以通过比较函数。 编辑的当前解决方案说明: 我目前的解决方案是将生日作为一个单独的字段包含在数组中,并将生日的年份设置为当前年份。现在的日期是同一年,分拣工作。但是,将出生年份单独列为一个字段并不合适。我希望我能从一个日期对象获得所有必要的数据 这单独的领域磨我的齿轮。这并不完美 编辑: 哦,是的 更新 还有一个PHP数组排序函数,它接受比较回调,例如uasort,可用于像我这样的关联数组:Php 数据提供者日期排序,php,sorting,gridview,yii2,dataprovider,Php,Sorting,Gridview,Yii2,Dataprovider,我拥有DateTime-birthdate类型字段的ArrayDataProvider。 我将该数据提供程序用于视图部分中的gridview 由于出生日期包括出生年份,因此排序未按预期进行。 有没有办法告诉排序机制不要计算年份,而只按月份和日期排序?可能是自定义排序功能 > >编辑: C++中的“代码>排序/,在这里你可以通过比较函数。 编辑的当前解决方案说明: 我目前的解决方案是将生日作为一个单独的字段包含在数组中,并将生日的年份设置为当前年份。现在的日期是同一年,分拣工作。但是,将出生年份
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
],
]
]);