Пользовательский форматированный JSON от MYSQL PDO для использования в NVD3.js

Я хотел бы создать пользовательский форматированный 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" } ] } ] 

В приведенном выше примере есть только две строки, но практически я хотел бы вытащить все values для каждого имени volume_name качестве 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" } ] } ] 

ОБНОВЛЕНИЯ ОТВЕТОВ

Шарлотта Дюнуа обновила выход:

 { "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); 

Related of "Пользовательский форматированный JSON от MYSQL PDO для использования в NVD3.js"

Вы должны создать новый массив с этой структурой, прежде чем кодировать его как объект 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']); } 

Используйте array_values ​​(), если вам нужны цифровые клавиши (0 – ….) для первого измерения.