2012-09-08 30 views
0

我需要使用highcharts创建basic column chart。这里是我的PHP代码:如何将正确的数据格式从SQL传递到PHP

$query = "SELECT campaign_id, kpi, label, val FROM table WHERE id = $1"; 

$result = pg_prepare($db, "report", $query); 
$result = pg_execute($db, "report", array($campaignID)); 

while ($row = pg_fetch_array($result, NULL, PGSQL_ASSOC)) 
{ 
    $response['xlabels'][] = $row['label']; 
    $response['xdata'][] = (float)$row['val']; 
} 

pg_free_result($result); 
pg_close($db); 

echo json_encode($response); 

PostgreSQL的查询返回的数据如下(CAMPAIGN_ID = 5,例如):

id | kpi | label | val 
----+-----------+-------+------ 
    5 | Voter  | East | 0.18 
    5 | Non-Voter | East | 0.12 
    5 | Voter  | West | 0.82 
    5 | Non-Voter | West | 0.88 

我的API保存xlabelsxdataxAxis.categoriesseries

$.get('vote_api.php', {'id' : id}, function(data) { 

    options.chart.type = 'column'; 

    options.xAxis.categories = data.xlabels; 
    options.series = data.xdata; 

    chart = new Highcharts.Chart(options); 

    }, "json"); 

kpi(选民与非选民)的正确数据格式为我的系列和label(东VS西)作为我的X轴应(请参考JSFiddle):

xAxis.categories = ['East', 'West']; 
series = [{name: 'Voter', 
      data: [0.18, 0.82]}, 
      {name: 'Non-Voter', 
      data: [0.12, 0.88]}] 

但是我while loop部分$response['xlabels'][] = $row['label']; $response['xdata'][] = (float)$row['val'];给我这样的事情:

[xlabels] => Array 
    (
     [0] => East 
     [1] => East 
     [2] => West 
     [3] => West 
    ) 

[xdata] => Array 
    (
     [0] => 0.18 
     [1] => 0.12 
     [2] => 0.82 
     [3] => 0.88 
    ) 

会有人给出一些提示如何去做这个?我真的很感激它!

+0

为什么downvote ??? – Rock

回答

1

你可以试试:

$query = "SELECT campaign_id, kpi, label, val FROM table WHERE id = $1"; 

$result = pg_prepare($db, "report", $query); 
$result = pg_execute($db, "report", array($campaignID)); 

while ($row = pg_fetch_array($result, NULL, PGSQL_ASSOC)) 
{ 
    if (!in_array($row['label'], $response['xlabels'])) 
    { 
     $response['xlabels'][] = $row['label']; 
    } 
    $response['xdata'][ $row['kpi'] ][] = (float)$row['val']; 
} 

pg_free_result($result); 
pg_close($db); 

第一个变化:

if (!in_array($row['label'], $response['xlabels'])) 
    { 
     $response['xlabels'][] = $row['label']; 
    } 

避免了多次拯救 “东方” 和 “西方” 你xlabels阵列。

第二个变化:

$response['xdata'][ $row['kpi'] ][] = (float)$row['val']; 

将添加一个维度到XDATA数组:值根据它们的“KPI”分配给不同的阵列。

+0

非常感谢Alain。这对我很有帮助。谢谢! – Rock

+0

对不起,阿兰,我仍然试图调试正确的格式。我想我真正需要的是像一些事情:'阵列 ( [0] =>阵列 ( [名] =>选民 [数据] =>阵列 \t \t( \t \t \t 0.18,0.82 \t \t) ) [1] =>数组 ( [名称] =>非选民 [数据] =>数组 \t \t( \t \t \t 0.12,0.88 \t \t) ) )',使得JSON可编码它为:'{名称: '投票',数据:[0.18,0.82]}, {名称: '非选民',数据: [0.12,0.88]}。我正在使用你的代码,但它没有指定'name'和'data'。你能帮忙吗?谢谢! – Rock

+1

在所有其他代码后添加此代码: '$ final = array(); ($ $ => $ data) { \t $ elem = new stdClass(); \t $ elem-> name = $ name; \t $ elem-> data = $ data; \t $ final [] = $ elem; }' –

相关问题