PHP循环多维数组,但按日期、类型和总和类型分组?
我得到了一个数组,以简化每个数组所具有的PHP循环多维数组,但按日期、类型和总和类型分组?,php,arrays,multidimensional-array,Php,Arrays,Multidimensional Array,我得到了一个数组,以简化每个数组所具有的 [0] => Array ( [target_id] [target_date] [intensity_id] [target_intensity] ) [1] => Array ( [target_id] [target_date] [intensity_id] [target_intensity] ) 示例数据(原始数组是assoc数组) 现在我需要回显这些数据作为谷歌堆叠条形图的输入 所以我需要得到每个月的目标强度之和(一个强度在
[0] => Array
(
[target_id]
[target_date]
[intensity_id]
[target_intensity]
)
[1] => Array
(
[target_id]
[target_date]
[intensity_id]
[target_intensity]
)
示例数据(原始数组是assoc数组)
现在我需要回显这些数据作为谷歌堆叠条形图的输入
所以我需要得到每个月的目标强度之和(一个强度在一个月内出现的次数),如下所示
date bad good excellent
2016 dec 0 1 1
2017 jan 0 1 0
2017 feb 1 2 0
2017 mrt 0 1 1
2017 may 3 0 1
2017 jun 0 1 0
我被困在这里了
$tmpArray = array(
array('target_id' => 1829, 'target_date' => '2017-06-23', 'intensity_id'=>2, 'target_intensity'=>'good'),
array('target_id' => 2013, 'target_date' => '2017-05-22', 'intensity_id'=>1, 'target_intensity'=>'bad'),
array('target_id' => 2024, 'target_date' => '2017-05-18', 'intensity_id'=>1, 'target_intensity'=>'bad'),
array('target_id' => 2029, 'target_date' => '2017-05-14', 'intensity_id'=>1, 'target_intensity'=>'bad'),
array('target_id' => 2032, 'target_date' => '2017-05-10', 'intensity_id'=>3, 'target_intensity'=>'bad'),
array('target_id' => 2329, 'target_date' => '2017-03-23', 'intensity_id'=>2, 'target_intensity'=>'good'),
array('target_id' => 2629, 'target_date' => '2017-03-12', 'intensity_id'=>3, 'target_intensity'=>'excellent'),
array('target_id' => 2830, 'target_date' => '2017-02-03', 'intensity_id'=>2, 'target_intensity'=>'good'),
array('target_id' => 3829, 'target_date' => '2017-02-23', 'intensity_id'=>2, 'target_intensity'=>'good'),
array('target_id' => 4029, 'target_date' => '2017-02-18', 'intensity_id'=>1, 'target_intensity'=>'bad'),
array('target_id' => 4039, 'target_date' => '2017-01-23', 'intensity_id'=>2, 'target_intensity'=>'good'),
array('target_id' => 4049, 'target_date' => '2016-12-12', 'intensity_id'=>3, 'target_intensity'=>'excellent'),
array('target_id' => 4056, 'target_date' => '2016-12-23', 'intensity_id'=>2, 'target_intensity'=>'good')
);
//echo $tmpArray[3]['target_date'];
//exit();
// should i first loop and order by month and then
//should i create 3 tmp arrays for bad, good and excellent
foreach ($tmpArray as $key => $values) {
echo $values['target_date'] . '<br/>';
//print_r ($values).'<br/>';
foreach ($values as $key => $value) {
// echo '<pre>';
echo $key . ' - ' . $value . '<br/>';
// echo '</pre>';
}
echo '<hr/>';
}
$tmpArray=array(
数组('target_id'=>1829,'target_date'=>2017-06-23,'intensity_id'=>2,'target_intensity'=>good'),
数组('target\u id'=>2013,'target\u date'=>2017-05-22,'intensity\u id'=>1,'target\u intensity'=>bad'),
数组('target_id'=>2024,'target_date'=>2017-05-18,'intensity_id'=>1,'target_intensity'=>bad'),
数组('target_id'=>2029,'target_date'=>2017-05-14,'intensity_id'=>1,'target_intensity'=>bad'),
数组('target_id'=>2032,'target_date'=>2017-05-10,'intensity_id'=>3,'target_intensity'=>bad'),
数组('target_id'=>2329,'target_date'=>2017-03-23,'intensity_id'=>2,'target_intensity'=>good'),
数组('target_id'=>2629,'target_date'=>2017-03-12,'intensity_id'=>3,'target_intensity'=>'excellent'),
数组('target_id'=>2830,'target_date'=>2017-02-03,'intensity_id'=>2,'target_intensity'=>good'),
数组('target_id'=>3829,'target_date'=>2017-02-23,'intensity_id'=>2,'target_intensity'=>good'),
数组('target_id'=>4029,'target_date'=>2017-02-18,'intensity_id'=>1,'target_intensity'=>bad'),
数组('target_id'=>4039,'target_date'=>2017-01-23,'intensity_id'=>2,'target_intensity'=>good'),
数组('target_id'=>4049,'target_date'=>2016-12-12,'intensity_id'=>3,'target_intensity'=>'excellent'),
数组('target_id'=>4056,'target_date'=>2016-12-23,'intensity_id'=>2,'target_intensity'=>good'))
);
//echo$tmpArray[3][“目标日期];
//退出();
//我应该先循环,然后按月订购吗
//我应该为坏、好和优秀创建3个tmp阵列吗
foreach($tmpArray作为$key=>$value){
echo$value['target_date'].
;
//打印($values)。“
”;
foreach($key=>$value的值){
//回声';
$tmpArray = array_map(function($target) {
$target['target_date'] = substr($target['target_date'], 0, 7);
return $target;
}, $tmpArray);
$finalData = array_reduce($tmpArray, function($carry, $target) {
if(!isset($carry[$target['target_date']])) {
$carry[$target['target_date']] = ['bad' => 0, 'good' => 0, 'excellent' => 0];
}
$carry[$target['target_date']][$target['target_intensity']]++;
return $carry;
}, []);
回显$key.'-'.$value.
;
//回声';
$tmpArray = array_map(function($target) {
$target['target_date'] = substr($target['target_date'], 0, 7);
return $target;
}, $tmpArray);
$finalData = array_reduce($tmpArray, function($carry, $target) {
if(!isset($carry[$target['target_date']])) {
$carry[$target['target_date']] = ['bad' => 0, 'good' => 0, 'excellent' => 0];
}
$carry[$target['target_date']][$target['target_intensity']]++;
return $carry;
}, []);
}
回声“
”;
}
感谢任何帮助基本上有两个步骤需要完成,按年/月对数据进行分组并计算实际总和。为了分组,您需要一个公共标识符(只需从输入中删除日期)。总和基本上是分组函数
<?php
$array = array(
array('target_id' => 1829, 'target_date' => '2017-06-23', 'intensity_id'=>2, 'target_intensity'=>'good'),
array('target_id' => 2013, 'target_date' => '2017-05-22', 'intensity_id'=>1, 'target_intensity'=>'bad'),
array('target_id' => 2024, 'target_date' => '2017-05-18', 'intensity_id'=>1, 'target_intensity'=>'bad'),
array('target_id' => 2029, 'target_date' => '2017-05-14', 'intensity_id'=>1, 'target_intensity'=>'bad'),
array('target_id' => 2032, 'target_date' => '2017-05-10', 'intensity_id'=>3, 'target_intensity'=>'bad'),
array('target_id' => 2329, 'target_date' => '2017-03-23', 'intensity_id'=>2, 'target_intensity'=>'good'),
array('target_id' => 2629, 'target_date' => '2017-03-12', 'intensity_id'=>3, 'target_intensity'=>'excellent'),
array('target_id' => 2830, 'target_date' => '2017-02-03', 'intensity_id'=>2, 'target_intensity'=>'good'),
array('target_id' => 3829, 'target_date' => '2017-02-23', 'intensity_id'=>2, 'target_intensity'=>'good'),
array('target_id' => 4029, 'target_date' => '2017-02-18', 'intensity_id'=>1, 'target_intensity'=>'bad'),
array('target_id' => 4039, 'target_date' => '2017-01-23', 'intensity_id'=>2, 'target_intensity'=>'good'),
array('target_id' => 4049, 'target_date' => '2016-12-12', 'intensity_id'=>3, 'target_intensity'=>'excellent'),
array('target_id' => 4056, 'target_date' => '2016-12-23', 'intensity_id'=>2, 'target_intensity'=>'good')
);
$output = [];
foreach($array as $value) {
$year = date('Y', strtotime($value['target_date']));
$month = date('M', strtotime($value['target_date']));
if(empty($output[$year][$month]))
$output[$year][$month] = ['bad' => 0, 'good' => 0, 'excellent' => 0];
$output[$year][$month][$value['target_intensity']] += 1;
}
ksort($output);
ksort($output[$year]);
echo "<pre>";
print_r($output);
?>
希望这能对您有所帮助:这里我只是将结果分组以生成数组
2016年年年
年年年年年年年年年年年年年年年年年年年年的强度只有优秀
和好的强度,那么为什么