如何将正确的数据格式从SQL传递到PHP


How to pass the correct data format from SQL to PHP

我需要使用highcharts创建一个基本的柱状图。这是我的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将xlabelsxdata保存到xAxis.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(选民与非选民)和作为我的xAxis的label(东部与西部)的正确数据格式应该是(请参阅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
    )

有人能给我一些提示吗?我真的很感激!!

您可以尝试:

$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'];
    }

避免将"East"answers"West"多次保存到xlabels数组中。

第二个变化:

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

将向xdata数组添加一个维度:根据不同数组的"kpi"将值分配给它们。