2014-02-07 47 views
0

我在PHP中創建一個數組以返回到前端以在Flot折線圖中顯示。我有數據應該按月顯示。如果我的SQL語句沒有找到給定月份的任何值,那麼該月沒有數組元素,並且Flot圖表不會繪製該月的數據點(請參見下面的截圖中的Mar和Apr)。我希望它能在沒有數據的月份顯示零數據點。爲Flot填充缺失的數組元素,其值爲零

下面是我如何創建我的數組:

 $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"} 

,這裏是如何目前圖表與th顯示Ë電流輸出:

enter image description here

+0

當您嘗試輸出$ month變量時,您是否獲得了1-5個月? 你$ tags數組看起來像什麼? – rccoros

+0

我只收到1,2和5,因爲這是數據庫中唯一的數據。沒有什麼需要改變,我只需要修改我的PHP來填充零值的數組中的空白。 – hyphen

回答

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; 
    } 
+0

好的,這似乎有一個例外:它似乎沒有添加一個零數組元素,當上個月是空的。在我最初給出的例子中,如果我要將代碼更改爲當前月份的7月份,那麼最後一個月的數據是May,但它不會在6月和7月添加元素。我有一個當前月份的變量($ cur_month),也可以幫助解決這個問題。我最初的想法是將整個事件封裝在一個while循環中,它表示while $ monthVal <= $ cur_month,但是當我嘗試它時似乎會引發錯誤。 – hyphen

+0

@hyphen如果我理解正確,我認爲你需要上個月的數據。您可以在新的while循環中的foreach循環之後使用$ current_month變量。檢查編輯。 – Kamehameha

+0

謝謝!完美的作品! – hyphen

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)); 
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); 
0

我會更改您的SQL查詢以返回更多數據,如果它存儲爲日期。 儘量保持日期而不是整數。 PHP和SQL date函數是廣泛和有用的。

這個簡單的for循環將填充陣列中之前的SQL查詢中缺失的數據。

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); 
}