mysql — PHP PDO Конвертировать массив в другой формат

Я пытаюсь преобразовать массив, полученный с помощью приведенного ниже кода, используя не осуждаемые методы с php pdo:

$stm = $conn->prepare("SELECT * FROM mysqltable");
$stm->execute();
$results = $stm->fetchAll(PDO::FETCH_ASSOC);
print_r($results);

в следующем формате, необходимом для использования fusioncharts

[
{
label: "CJ Anderson",
value: "25"},
{
label: "Imran Tahir",
value: "25"},
...
...
]

Исходный массив выглядит следующим образом:

Array (
[0] => Array (
[Id] => 6
[Number] => 1234567890
[Visits] => 1
[Name] => John
)
[1] => Array (
[Id] => 7
[Number] => 1236549871
[Visits] => 9
[Name] => Jerry
)
[2] => Array (
[Id] => 8
[Number] => 2147483647
[Visits] => 3
[Name] => Jane
)
)

Любая помощь будет оценена, спасибо.

РЕДАКТИРОВАТЬ:
Как я прокомментировал ниже. У меня есть полный файл php, который работает, если вы вводите данные вручную. Я не могу заставить его работать, хотя, когда я вставляю $ jsonEncodedData, хотя. Мысли?

<html>
<head>
<title>FusionCharts XT - Column 2D Chart - Data from a database</title>
<link  rel="stylesheet" type="text/css" href="css/style.css" />

<!-- You need to include the following JS file to render the chart.
When you make your own charts, make sure that the path to this JS file is correct.
Else, you will get JavaScript errors. -->

<script src="fusioncharts/js/fusioncharts.js"></script>
</head>

<body>
<?php

try {

# MySQL with PDO_MYSQL
$mysql_host = 'host';
$mysql_database = 'table';
$mysql_username = 'user';
$mysql_password = 'pass';

$conn = new PDO("mysql:host=$mysql_host; dbname=$mysql_database", $mysql_username, $mysql_password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->exec("SET CHARACTER SET utf8");      // Sets encoding UTF-8

}
catch(PDOException $e) {
echo $e->getMessage();
}

// Form the SQL query that returns the top 10 most populous countries

// Execute the query, or else return the error message.
$stm = $conn->prepare("SELECT Name, Visits FROM mysqltable"); //WHERE Area :SelArea");
$stm->execute();
$results = $stm->fetchAll(PDO::FETCH_ASSOC);

include("fusioncharts.php");

$jsnarray = array();
foreach($results as $k => $v){
$jsnarray[] = array('label' => $results[$k]['Name'], 'value' => $results[$k]['Visits']);
};
$jsonEncodedData=json_encode($jsnarray);

new FusionCharts("type of chart",
"unique chart id",
"width of chart",
"height of chart",
"div id to render the chart",
"type of data",
"actual data");
$columnChart = new FusionCharts(
"column2d",
"ex1" ,
"600",
"400",
"chart-1",
"json",
'{
"chart":
{
"caption":"Harry\'s SuperMart",
"subCaption":"Top 5 stores in last month by revenue",
"numberPrefix":"$",
"theme":"ocean"},
"data":  //$jsonEncodedData}'); <---I tried to insert this after "data":but no results unlike if you put raw data**
[
{
"label":"Bakersfield Central",
"value":"880000"},
{
"label":"Garden Groove harbour",
"value":"730000"},
{
"label":"Los Angeles Topanga",
"value":"590000"},
{
"label":"Compton-Rancho Dom",
"value":"520000"},
{
"label":"Daly City Serramonte",
"value":"330000"}
]
}');
// Render the chart
$columnChart->render();
?>

<div id="chart-1"><!-- Fusion Charts will render here--></div>

</body>

</html>

============== Редактировать 12/28/15 ==========

Попробовал следующий код безрезультатно. Вопрос, который у меня есть, не должен ли мы заканчиваться на «}», поскольку они требуют этого:

    $columnChart = new FusionCharts(
"column2d",
"ex1" ,
"600",
"400",
"chart-1",
"json",
'{
"chart":
{
"caption":"Harry\'s SuperMart",
"subCaption":"Top 5 stores in last month by revenue",
"numberPrefix":"$",
"theme":"ocean"},
"data": ' . $jsonEncodedData);
//}';
// Render the chart
print_r($columnChart);
$columnChart->render();
?>

<div id="chart-1"><!-- Fusion Charts will render here--></div>

</body>

</html>

Я хотел также опубликовать различия в массиве между методом «manual» и методом «fetch» (выше в этом редактировании).

С доставкой:

FusionCharts Object ([constructorOptions: FusionCharts: private] => Array (> [type] => column2d [id] => ex1 [width] => 600 [height] => 400 [renderAt] =>> chart-1 [dataFormat) ] => json [dataSource] => {«chart»: {> «caption»: «Harry’s SuperMart», «subCaption»: «Топ-5 магазинов в прошлом месяце по> доходам», «numberPrefix»: «$», » theme «:» ocean «},» data «:> [{» label «:» John «,» value «:» 125 «}, {» label «:» Jerry «,» value «:» 125 «}, {«label»: «Jane», «value»: «125»}]) [constructorTemplate: FusionCharts: private] =>> [renderTemplate: FusionCharts: private] =>)

С ручным методом (который работает):

FusionCharts Object ([constructorOptions: FusionCharts: private] => Array (> [type] => column2d [id] => ex1 [width] => 600 [height] => 400 [renderAt] =>> chart-1 [dataFormat) ] => json [dataSource] => {«chart»: {> «caption»: «Harry’s SuperMart», «subCaption»: «Топ-5 магазинов в прошлом месяце по> доходам», «numberPrefix»: «$», » theme «:» ocean «},» data «: [{>» label «:» Bakersfield Central «,» value «:» 880000 «}, {» label «:» Garden Groove> harbor «,» value «:» 730000 «}, {» label «:» Los Angeles Topanga «,>» value «:» 590000 «}, {» label «:» Compton-Rancho Dom «,» value «:» 520000 «}, {>» label «:» Daly City Serramonte «,» value «:» 330000 «}]})>> [constructorTemplate: FusionCharts: private] =>> [renderTemplate: FusionCharts: private] =>)

Я вижу два отличия: руководство вставляет пробелы вокруг «данных» и конечный параметр}.

4

Решение

Существует автоматический (и намного более простой) способ сделать это:

$stm = $conn->prepare('SELECT Name AS label, Visits AS value FROM mysqltable;');
$stm->execute();
$results = $stm->fetchAll(PDO::FETCH_ASSOC);
$jsonEncodedData = json_encode($results);
echo $jsonEncodedData;

Выход (локально проверено):

[{"label":"Foo","value":"5"},{"label":"Bar","value":"15"}]

Таким образом, вы можете просто использовать его так:

$columnChart = new FusionCharts('...
...
"data": ' . $jsonEncodedData . '}');

Обратите внимание . '}' в конце.


Перед редактированием:


Вы могли бы сделать что-то вроде этого:

// This part is just for running purposes
$foo = array (
0 => Array (
'Id' => 6,
'Number' => 1234567890,
'Visits' => 1,
'Name' => 'John'
),
1 => array (
'Id' => 7,
'Number' => 1236549871,
'Visits' => 9,
'Name' => 'Jerry'
),
2 => array (
'Id' => 8,
'Number' => 2147483647,
'Visits' => "3", // Example to output quoted
'Name' => 'Jane'
)
);

$bar = array();
foreach($foo as $k => $v){
$bar[] = array('label' => $foo[$k]['Name'], 'value' => $foo[$k]['Visits']);
}

echo json_encode($bar);

Выход:

[{"label":"John","value":1},{"label":"Jerry","value":9},{"label":"Jane","value":"3"}]

Сравните с вашим (из вопроса) в одной строке:

[{label: "CJ Anderson",value: "25"},{label: "Imran Tahir",value: "25"},...]

Замечания: Я предположил, что value представлен Visit а также label от Name,

Узнайте больше о json_encode.

6

Другие решения

В качестве резюме это часть, которая решает проблему, включая заявление foreach FirstOne:

$stm = $conn->prepare("SELECT Name, Visits FROM mysqltable"); //WHERE Area :SelArea");
$stm->execute();
$results = $stm->fetchAll(PDO::FETCH_ASSOC);

include("fusioncharts.php");

$jsnarray = array();
foreach($results as $k => $v){
$jsnarray[] = array('label' => $results[$k]['Name'], 'value' => $results[$k]['Visits']);
};

$jsonEncodedData=json_encode($jsnarray);
//print_r($jsonEncodedData);

new FusionCharts("type of chart",
"unique chart id",
"width of chart",
"height of chart",
"div id to render the chart",
"type of data",
"actual data");
$columnChart = new FusionCharts(
"column2d",
"ex1" ,
"600",
"400",
"chart-1",
"json",
'{
"chart":
{
"caption":"Harry\'s SuperMart",
"subCaption":"Top 5 stores in last month by revenue",
"numberPrefix":"$",
"theme":"ocean"},
"data": ' . $jsonEncodedData . '}');
// Render the chart
print_r($columnChart);
$columnChart->render();
?>

<div id="chart-1"><!-- Fusion Charts will render here--></div>

</body>

</html>

Спасибо всем за помощь в решении проблемы.

2

По вопросам рекламы [email protected]