Javascript Jquery或PHP按日期字段分组的对象数组

Javascript Jquery或PHP按日期字段分组的对象数组,javascript,php,jquery,mysql,arrays,Javascript,Php,Jquery,Mysql,Arrays,因此,我有一个json响应,其中包含用于创建图表的格式化数据(使用Canvas.js),它是一个对象数组,每个对象都包含y值(int)和标签(SQL日期,如2016-02-06) 我需要的是将这些值按日期分组,并从中获得平均值。数据按日期排序。问题是,一天可能会有随机的点数,而另一天可能根本没有点数。所以,我需要一种周指数(计算一年中的周不是一个解决方案,因为可能有很多年)。例如,我可以使用以下数组: [0] {y: 2; label: 2016-04-01} // this is week 1

因此,我有一个json响应,其中包含用于创建图表的格式化数据(使用Canvas.js),它是一个对象数组,每个对象都包含y值(int)和标签(SQL日期,如2016-02-06)

我需要的是将这些值按日期分组,并从中获得平均值。数据按日期排序。问题是,一天可能会有随机的点数,而另一天可能根本没有点数。所以,我需要一种周指数(计算一年中的周不是一个解决方案,因为可能有很多年)。例如,我可以使用以下数组:

[0] {y: 2; label: 2016-04-01} // this is week 1 from the start of the array
[2] {y: 6; label: 2016-04-02} // this is still week 1
[3] {y: 1; label: 2016-04-13} // this is week 2
[4] {y: 10; label: 2016-04-28} // this is week 3, if we count weeks only by appearance in the array, not by their actual position
[5] {y: 2; label: 2016-05-01} // this is week 4
[6] {y: 4; label: 2016-05-02} // still week 4
所以我需要以某种方式得到这几周,然后找到平均y值,从上面的数组中我可以得到:

[0] {y: 4; label: 2016-04-01}
[2] {y: 1; label: 2016-04-13}
[3] {y: 10; label: 2016-04-28}
[4] {y: 3; label: 2016-05-01}

这怎么办?我想我应该使用PHP方法,放弃在前端实现它,或者可能有更简单的方法来处理这个问题?或者可能有允许自动分组的js图表插件?我将非常感谢任何可能的帮助

您可以尝试以下方法:

$weeks = array();

foreach ($myData as $info) {
    $info = json_decode($info, true);
    $dateTime = new DateTime($info['label']);
    $weeksKey = $dateTime->format('W-Y');
    if (!isset($weeks[$weeksKey])) {
        $weeks[$weeksKey] = array('y' => $info['y'], 'label' => $dateTime, 'count' => 1);
    } else {
        $weeks[$weeksKey]['y'] += $info['y'];
        $weeks[$weeksKey]['count']++;
        $weeks[$weeksKey]['label'] = $weeks[$weeksKey]['label'] > $dateTime
            ? $dateTime 
            : $weeks[$weeksKey]['label'];
    }
}

$weeks = array_map(function($week) {
    return json_encode(array(
        'y' => $week['y'] / $week['count'],
        'label' => $week['label']->format('Y-m-d')
    ));
}, $weeks);

var_dump($weeks); // or var_dump(array_values($weeks));

在Javascript中,可以使用对象进行收集,使用数组进行结果

该提案利用了对的答复

后面的代码是一个分组部分,它获取年份和周数,并收集用于平均计算的数据

//取自https://stackoverflow.com/a/6117889/1447675
Date.prototype.getWeekNumber=函数(){
var d=新日期(+此日期);
d、 设定小时数(0,0,0);
d、 设置日期(d.getDate()+4-(d.getDay()| 7));
返回Math.ceil(((d-新日期(d.getFullYear(),0,1))/8.64e7)+1)/7);
};
var数据=[{y:2,标签:'2016-04-01'},{y:6,标签:'2016-04-02'},{y:1,标签:'2016-04-13'},{y:10,标签:'2016-04-28'},{y:2,标签:'2016-05-01'},{y:4,标签:'2016-05-02'},
平均值=[];
data.forEach(函数(a){
变量年份=a.label.slice(0,4),
周=新日期(a.label).getWeekNumber(),
键=年+周+周;
如果(!此[键]){
此[键]={count:0,sum:0,result:{y:0,label:a.label};
avg.push(此[key].result);
}
此[key].count++;
此[key].sum+=a.y;
此[key]。result.y=此[key]。求和/此[key]。计数;
},Object.create(null));

控制台日志(平均值)我建议在PHP端获取、排序、过滤数据,并且只使用前端显示数据。