来自 MYSQL PDO 的自定义格式 JSON,用于 NVD3.js
Posted
技术标签:
【中文标题】来自 MYSQL PDO 的自定义格式 JSON,用于 NVD3.js【英文标题】:Custom formatted JSON from MYSQL PDO for use in NVD3.js 【发布时间】:2014-10-22 19:48:11 【问题描述】:我想创建自定义格式的 JSON 以与 NVD3.js 一起使用,但不确定如何使用 PDO 创建嵌套数组?
示例数据表:
+--------------+-------------------+---------------------+
| volume_name | volume_files_used | recorded |
+--------------+-------------------+---------------------+
| content001 | 130435938 | 2014-08-22 13:20:44 |
| content002 | 95977391 | 2014-08-22 13:20:44 |
+--------------+-------------------+---------------------+
使用PDO
和json_encode()
:
//JSON OUTPUT
$stmtJSON = $pdo->prepare("SELECT volume_name,
volume_files_used,
recorded FROM collection;");
$stmtJSON->execute();
$json = json_encode($stmtJSON->fetchAll(PDO::FETCH_ASSOC));
print_r($json);
当前JSON
输出:
[
"volume_name": "content001",
"volume_files_used": "130435938",
"recorded": "2014-08-22 13:20:44"
,
"volume_name": "content002",
"volume_files_used": "95977391",
"recorded": "2014-08-22 13:20:44"
]
我想要以下JSON
输出:
[
"key": "content001",
"values": [
"x": "2014-08-22 13:20:44",
"y": "130435938"
]
,
"key": "content002",
"values": [
"x": "2014-08-22 13:20:44",
"y": "95977391"
]
]
在上面的示例中只有两行,但实际上我想将每个volume_name
的所有values
提取为key
:
[
"key": "content001",
"values": [
"x": "2014-08-22 13:20:44",
"y": "130435938"
,
"x": "2014-08-22 14:20:44",
"y": "130435940"
,
"x": "2014-08-22 15:20:44",
"y": "130435945"
,
"x": "2014-08-22 16:20:44",
"y": "130435965"
]
,
"key": "content002",
"values": [
"x": "2014-08-22 13:20:44",
"y": "95977391"
,
"x": "2014-08-22 14:20:44",
"y": "95977402"
,
"x": "2014-08-22 15:20:44",
"y": "95977445"
,
"x": "2014-08-22 16:20:44",
"y": "95977457"
]
]
回答更新
Charlotte Dunois更新输出:
"content002":
"values": [
"y": "95583732",
"x": "2014-08-27 11:05:01"
,
"y": "95539534",
"x": "2014-08-27 12:05:01"
],
"key": "content002"
,
"content001":
"values": [
"y": "130121075",
"x": "2014-08-27 11:05:01"
,
"y": "130131806",
"x": "2014-08-27 12:05:01"
],
"key": "content001"
工作答案
我设法从另一个开发人员那里获得了帮助。下面的代码是有效的,但如果你能做得更好,任何人都可以发表评论。
//JSON OUTPUT
$stmtJSON = $pdo->prepare("SELECT volume_name,
volume_files_used,
recorded FROM collection;");
$stmtJSON->execute();
$result = $stmtJSON->fetchAll(PDO::FETCH_ASSOC));
$temp_array = array();
foreach($result as $bf)
if (!isset($temp_array[$bf['volume_name']]))
$temp_array[$bf['volume_name']] = array();
$temp_array[$bf['volume_name']][] = array(
"x" => $bf['recorded'],
"y" => $bf['volume_files_used']);
$final_array = array();
foreach ($temp_array as $volume_name => $values)
$final_array[] = array(
'key' => $volume_name,
'values' => $values);
$json = json_encode($final_array);
【问题讨论】:
【参考方案1】:在将其编码为 json 对象之前,您必须使用此结构创建一个新数组。这样就可以完成工作(您的新格式化数组位于 $new_array 中,因此您可以对其进行 json 编码):
$new_array = array();
foreach($pdo_response as $bf)
if(empty($new_array[$bf['volume_name']]))
$new_array[$bf['volume_name']] = array("key" => $bf['volume_name'], "values" => array());
$new_array[$bf['volume_name']]['values'][] = array("x" => $bf['recoreded'], "y" => $bf['volume_files_used']);
如果您想要数字键 (0 - ....) 作为第一个维度,请使用 array_values()。
【讨论】:
x
和 y
在你的回答中在哪里?
谢谢,差不多了!刚刚用输出和进一步澄清更新了我的问题。
您知道工作答案与我的基本相同,只是不如我的性能好?以上是关于来自 MYSQL PDO 的自定义格式 JSON,用于 NVD3.js的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PHP PDO 在 mySQL 中插入多行 JSON 对象数据?
来自 javascript PageMethods 的自定义 C# 数据传输对象