使用Flot的零值填充缺少的数组元素

时间:2014-02-07 11:47:27

标签: php arrays flot

我正在PHP中创建一个数组,以发送回前端以在Flot折线图中显示。我有数据应该按月显示年份。如果我的SQL语句没有找到给定月份的任何值,则该月没有数组元素,并且Flot图表不会绘制该月的数据点(请参见下面的截图中的Mar和Apr)。我希望在没有数据的情况下显示零数据点。

以下是我创建数组的方法:

        $array = array();
        $array['data'] = Array();
        $array['label'] = $tags[0]['tag_name'];

        foreach($tags as $key=>$value) {                
            $month = $value['month'];
            $arr = Array($month, $value['trans_amount']);
            array_push($array['data'], $arr);
        }

当前输出:

{"data":[[1,"75.00"],[2,"170.00"],[5,"100.00"]],"label":"example label"}

期望的输出:

{"data":[[1,"75.00"],[2,"170.00"],[3, "0"],[4, "0"],[5,"100.00"]],"label":"example label"}

以下是图表当前显示当前输出的方式:

enter image description here

4 个答案:

答案 0 :(得分:1)

这很有效。这是对你的foreach循环的一点修改。你需要一个额外的变量$ monthVal跟踪当前月份。

//Assuming this the month uptil which you want the data.
    $current_month = 7;
    $monthVal = 1;
    foreach($tags as $key=>$value) {                
        $month = $value['month'];
        if($month != $monthVal){
            while($month != $monthVal){
                $array['data'][] = Array($monthVal, "0");
                $monthVal += 1;
            }
        }
        $arr = Array($month, $value['trans_amount']);
        array_push($array['data'], $arr);
        $monthVal += 1;
    }
    //This loop is added to append the array if the last entry is not equal to $current_month.
    while($monthVal <= $current_month){
        $array['data'][] = Array($monthVal, "0");
        $monthVal += 1;
    }

答案 1 :(得分:0)

试试这个(适用于PHP 5.3 +):

$array = array();
$month_min = $month_max = 0;
foreach($tags as $value) {
    $month = $value['month'];
    $array[$month - 1] = array($month, $value['trans_amount']);
    $month_max = $month;
    if (!$month_min) $month_min = $month;
}

$months = array_values(array_map(function ($v) { return intval($v['month']); }, $tags));
$months_range = range(1, $month_max);

foreach (array_diff($months_range, $months) as $month) {
    $array[$month - 1] = array($month, 0);
}

$result = array(
    'data' => array_slice($array, $month - 1),
    'label' => $tags[0]['tag_name'],
);
print_r(json_encode($result));

答案 2 :(得分:0)

这应该有效。我所做的是检查是否有一个缺失的月份,然后填充那个月的零值作为值。

$currMonth = 1;
foreach($tags as $key=>$value) {                
    $month = $value['month'];
    if($month != $currMonth){
        //if we are missing some months populate that month with zero as value
        while($month != $currMonth){
            array_push($array['data'],Array($currMonth, "0"));
            $currMonth++;
        }
    }
    $arr = Array($month, "'" . $value['trans_amount'] . "'");
    array_push($array['data'], $arr);
    $currMonth++;
}

echo json_encode($array);

答案 3 :(得分:0)

如果将数据存储为日期,我会更改您的SQL查询以返回更多数据。 尝试将日期维护为日期而不是整数。 PHP和SQL date函数非常广泛且有用。

这个简单的for循环会在SQL之前的foreach查询中填充缺少的数据。

for($i=1;$i<=12;$i++){
    if(!isset($tags[$i])){
       $tags[$i]['month'] = $i;
       $tags[$i]['trans_amount'] = 0;
    }
}
foreach($tags as $key=>$value) {                
    $month = $value['month'];
    $arr = array($month, $value['trans_amount']);
    array_push($array['data'], $arr);
}