我有 ArrayDataProvider,其字段类型为 DateTime - 生日。 我将该数据提供者用于 View 部分中的 GridView 。
由于生日包括出生年份,因此排序未按预期进行。 有没有办法以某种方式告诉排序机制不考虑年份,只按月和日排序?也许是自定义排序功能?
编辑:类似于 C++ 中的 sort
,您可以在其中传递比较函数。
编辑当前解决方案描述: 我目前的解决方案是将出生年份作为数组中的单独字段,并将出生日期的年份设置为当前年份。现在日期来自同一年并且排序有效。但是出生年份的单独字段感觉不对。我希望我可以从一个日期对象中获取所有必要的数据。
这个单独的领域磨我的齿轮。这并不完美。
编辑: 哦,还有 Yii2
更新 还有一个采用比较回调的 PHP 数组排序函数 - 例如 uasort 可以用于像我这样的关联数组:
uasort($persons, function($a, $b){
return strcasecmp( $b['date']->format('m-d'), $a['date']->format('m-d') );
});
现在我需要找到将它实现到 ArrayDataProvider 中的方法。这里有什么想法吗?
最佳答案
如果你有一个数组数据提供者,你当然不能使用数据库排序。
使用 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 附带的类并覆盖 sortModels() -方法。
关于php - Yii Dataprovider 日期排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26331930/