我正在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"}
以下是图表当前显示当前输出的方式:
答案 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);
}