MySQL到JSON(用于NVD3.js)

时间:2014-05-05 20:52:27

标签: php mysql json d3.js nvd3.js

我正在尝试导出下面的MySQL表:

id, asof, value
abc, 2013-06-30, 36000000
abc, 2013-12-31, 48000000
abc, 2014-01-31, 51000000
abc, 2014-02-28, 56000000
xyz, 2013-06-30, 26000000
xyz, 2013-12-31, 33000000
xyz, 2014-01-31, 33000000
xyz, 2014-02-28, 36000000

使用以下json格式在nvd3.js图表​​中使用:

[ 
    { 
      "key" : "abc" , 
      "values" : [ [ 2013-06-30, 36000000] , [ 2013-12-31, 48000000] , [ 2014-01-31, 51000000] , [ 2014-02-28, 56000000]
    },
    { 
      "key" : "xyz" , 
      "values" : [ [ 2013-06-30, 26000000] , [ 2013-12-31, 33000000] , [ 2014-01-31, 33000000] , [ 2014-02-28, 36000000]
    }
]

我确定这是一个新手问题,但我正在努力解决它。任何指导都将非常感谢!

编辑:

我目前一直在尝试使用数组和while语句但是却无法弄清楚如何修改数组以便它可以输出到正确的json格式。

$query= mysqli_query($db,"SELECT id, asof, value
                          FROM table;"
                        );

if ( ! $query) {
        echo mysqli_error();
        die;
    }

$rows = array();

while($r = mysqli_fetch_assoc($query)) {
    $rows[] = $r;
}

print json_encode($rows);

1 个答案:

答案 0 :(得分:1)

这样做最简单的方法可能就是创建一个多维数组,用数据库中的数据填充它,然后使用json_encode创建一个JSON字符串,然后发送给客户端。

这是一个函数的简单示例,它将接受一个项目数组并以预期的格式返回一个JSON字符串。为简单起见,假设数据是一个包含三列的二维数组,但您应该修改它以使用数据库查询返回的格式。

function convert($data) {

    $intermediate = array();

    // This intermediate steps is used just to group all rows with
    // the same key
    foreach($data as $item) {
        list($key, $date, $value) = $item;
        $intermediate[$key][] = array($date, $value);
    }

    $output = array();

    foreach($intermediate as $key => $values) {
        $output[] = array(
            'key' => $key,
            'values' => $values
        );
    }

    return $output;
}

由于您是从数据库获取数据,因此第一个foreach语句中的变量$item实际上可能是一个关联数组,因此您必须编写类似$item['key']的内容来获取列中的数据当前行。

如果您想使用mysqli_fetch_assoc,那么您可以尝试以下列方式调用函数convert

$conn = mysqli_connect('', '', '')
$query = 'SQL you wish to execute'
$result = mysqli_query($conn, $query)

if($result) {
    $jsonData = convert($result);
}

然而,功能本身需要稍微改变

function convert($result) {

    $intermediate = array();

    while($item = mysqli_fetch_assoc($result)) {
        $key = $item['id'];
        $date = $item['asof'];
        $value = $item['value'];
        $intermediate[$key][] = array($date, $value);
    }

    // The rest of the function stays the same
}