2016-04-29 111 views
0

我想產生一個嵌套jsonnvd3 StackedAreaChart用途:產生這樣nvd3 StackAreaChart數據嵌套的JSON格式

[ 
     { 
      "key" : "North America" , 
      "values" : [ [ 1025409600000 , 23.041422681023] , [ 1028088000000 , 19.854291255832] ] 

     }, 

     { 
      "key" : "Africa" , 
      "values" : [ [ 1025409600000 , 7.9356392949025] , [ 1028088000000 , 7.4514668527298] ] 

     }, 

    ] 

來源:http://plnkr.co/edit/CIGW0o?p=preview

我想從我的數據庫中的數據。

我怎麼能達到那種json?我並不熟悉嵌套的json加上我在json的結構中注意到的一件事是values對象中的值是一個純整數。它的引用不像"1025409600000"。而當我嘗試記錄它時,圖表無法正確讀取數據。

問題

  1. 如何產生嵌套jsonnvd3用途?我已經進行了一些研究,但沒有任何反應。我發現了一些像我猜想的那樣,但無法讓它工作。 Here和這個one

  2. 是否有可能從json嵌套結構unquote?如果是,如何?

這就是我目前的工作:

 <?php 

     require_once('conn.php'); 

     $sql = "SELECT ua.user_id,(UNIX_TIMESTAMP(dt.transac_date)*1000) AS transac_date, 
         CONCAT(ui.fname,' ',ui.lname) AS fullname, 
         SUM((dt.item_price - dt.item_srp) * dt.sold) as profit, 
         SUM((dt.item_price) * dt.sold) as total_sales 
       FROM dsp_transactions dt 
       INNER JOIN user_acct ua ON dt.user_id=ua.user_id 
       INNER JOIN user_info ui ON ua.ui_id=ui.ui_id 
       GROUP BY ua.user_id"; 
     $qry = $con->query($sql); 

     $data = array(); 
     if($qry->num_rows > 0) { 
      while($row = $qry->fetch_object()) { 
       $data[] = array(

        'key' => $row->fullname, 
        'values' => $row->user_id 

        ); 
      } 
     } else { 
      $data[] = null; 
     } 

     $con->close(); 

     echo json_encode($data); 

     ?> 

這給我這個值:

[{"key":"Juan Dela Cruz","values":["1461772800000","5665.00"]},{"key":"Maria Gonzales","values":["1461772800000","275.00"]},{"key":"Apolinario Mabini","values":["1461772800000","100.00"]}] 

感謝提前:)

編輯

欲瞭解更多信息,我想是這樣的情況發生:

  dsp  | sales  | profit |  date  
    --------------+--------------+-------------+-------------- 
     Juan  | 500  |  100  | 04/24/2016 
    --------------+--------------+-------------+-------------- 
     Maria  | 600  |  200  | 04/24/2016 
    --------------+--------------+-------------+-------------- 
     Apolinario | 700  |  300  | 04/24/2016 
    --------------+--------------+-------------+-------------- 
     Juan  | 550  |  150  | 04/25/2016 

會回到像這樣json格式

[ 
     { 
      "key" : "Juan", 
      "values" : [ ["04/24/2016", "500"], ["04/25/2016", "550"] ] // "values" loop twice because "juan" has two sales 

     }, 
     { 
      "key" : "Maria", 
      "values" : [ ["04/24/2016", "600"] ] 

     }, 
     { 
      "key" : "Apolinario", 
      "values" : [ ["04/24/2016", "700"] ] 

     } 
    ] 

回答

1

我認爲這個問題你如何處理你的查詢返回的數據開始。根據我的理解,您需要將每個人的所有交易日期和銷售(或利潤)分組。因此,您需要在對其進行編碼之前對其進行操作。

看看這段代碼運行時,不要告訴我,如果一個錯誤的火災,但基本上,這是我看到的是解決問題的邏輯:

<?php 

require_once('conn.php'); 

$sql = "SELECT ua.user_id,(UNIX_TIMESTAMP(dt.transac_date)*1000) AS transac_date, 
       CONCAT(ui.fname,' ',ui.lname) AS fullname, 
       SUM((dt.item_price - dt.item_srp) * dt.sold) as profit, 
       SUM((dt.item_price) * dt.sold) as total_sales 
     FROM dsp_transactions dt 
     INNER JOIN user_acct ua ON dt.user_id=ua.user_id 
     INNER JOIN user_info ui ON ua.ui_id=ui.ui_id 
     GROUP BY transac_date, ua.user_id"; 
$qry = $con->query($sql); 

$data = array(); 
$individual_row = array(); 
if($qry->num_rows > 0) 
{ 
    while($row = pg_fetch_object($qry)) { 
     //we find if there is an existing row with the person 
     $indexOfIndividualRow = array_search($row->dsp, array_column($data, 'key')); 
     //if no rows of the person are added yet 
     if(empty($indexOfIndividualRow)&& !is_numeric($indexOfIndividualRow)) 
     { 
      $individual_row['key'] = $row->dsp; 
      $individual_row['values'] = array(array($row->date, $row->sales)); 
      array_push($data, $individual_row); 
     } 
     //if there is a row with person as key 
     else 
     { 
      //if there is a 'values' key 
      if(isset($data[$indexOfIndividualRow]['values'])){ 
       array_push($data[$indexOfIndividualRow]['values'], array($row->date, $row->sales)); 
      } 
      //else if there is no 'values' key 
      else $data[$indexOfIndividualRow]['values'] = array($row->date, $row->sales); 
     } 
    } 
} 
else { 
    $data[] = null; 
} 

$con->close(); 

echo json_encode($data); 
?> 
+0

感謝您的回覆。請參閱我上面的編輯。 –

+0

你試過我的代碼嗎?我認爲這就是我的解決方案想要輸出的內容。 –

+0

是的。我剛剛嘗試過。但只返回'values'中的第一個循環。我認爲這是因爲我的'query'只能得到'user's id',而我使用'GROUP BY'。它沒有得到「胡安」的兩個日期。任何想法如何解決我的'查詢'與您的代碼?我已經試過任何東西只是爲了滿足你的代碼輸出,但不能得到它的工作。 –