Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.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_Arrays_Multidimensional Array - Fatal编程技术网

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年年
年年年年年年年年年年年年年年年年年年年年的强度只有
优秀
和好的强度,那么为什么