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>

============== Редактировать 28.12.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>

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

С выборкой:

Объект FusionCharts ([constructorOptions: FusionCharts: private] => Array (> [type] => column2d [id] => ex1 [width] => 600 [height] => 400 [renderAt] =>> диаграмма-1 [dataFormat ] => json [dataSource] => {"chart": {> "caption": "Harry's SuperMart", "subCaption": "Лучшие 5 магазинов за последний месяц по> выручке", "numberPrefix": "$", " theme ":" ocean "}," data ":> [{" label ":" John "," value ":" 125 "}, {" label ":" Джерри "," value ":" 125 "}, {"label": "Jane", "value": "125"}]) [constructorTemplate: FusionCharts: private] =>> [renderTemplate: FusionCharts: private] =>)

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

Объект FusionCharts ([constructorOptions: FusionCharts: private] => Array (> [type] => column2d [id] => ex1 [width] => 600 [height] => 400 [renderAt] =>> диаграмма-1 [dataFormat ] => json [dataSource] => {"chart": {> "caption": "Harry's SuperMart", "subCaption": "5 лучших магазинов за последний месяц по> доходу", "numberPrefix": "$", " theme ":" ocean "}," data ": [{>" label ":" Bakersfield Central "," value ":" 880000 "}, {" label ":" Garden Groove> harbour "," value ":" 730000 "}, {" label ":" Лос-Анджелес Топанга ",>" value ":" 590000 "}, {" label ":" Compton-Rancho Dom "," value ":" 520000 "}, {>" label ":" Daly City Serramonte "," value ":" 330000 "}]})> [constructorTemplate: FusionCharts: private] =>> [renderTemplate: FusionCharts: private] =>)

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


person newpie    schedule 28.12.2015    source источник


Ответы (2)


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

$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.

person FirstOne    schedule 28.12.2015
comment
Это может быть достигнуто с помощью запросов SELECT Name AS label, Visits AS value FROM mysqltable и json_encode($results), которые намного эффективнее, поскольку меньше нагрузка на транспорт базы данных и не требуется дополнительных итераций. - person bansi; 28.12.2015
comment
@bansi, поскольку вы добавили это в качестве комментария к вопросу, я подумал, что вы хотели бы добавить это в качестве ответа. Некоторым людям не нравится, когда их комментарии «украдены», поэтому я добавил свой в качестве альтернативы. Если вас устраивает, я могу отредактировать и добавить ваш метод к утру (сейчас уже очень поздно). Таким образом, у других будет время добавить его, если они захотят. - person FirstOne; 28.12.2015
comment
обязательно добавлю это к ответу. это сделает это намного лучше - person bansi; 28.12.2015
comment
Спасибо за столь быстрый комментарий. Итак, я попробовал эту альтернативу FirstOne. Я действительно пытался json_encode, но заметил, что вывод не работает или не развивает диаграмму. Затем я использовал ваш метод foreach и все еще без результатов. Чтобы убедиться, что это не что-то еще, я поместил внутрь исходные данные для проверки. Я опубликую ниже php, который действительно работает, если вы используете данные сайтов. Любая помощь была бы замечательной. - person newpie; 28.12.2015
comment
@newpie, я видел ваше обновление, пробовали ли вы вместо "data": //$jsonEncodedData}'); использовать: "data": ' . $jsonEncodedData); (поскольку это одинарные кавычки, обратите внимание на конкатенацию) - person FirstOne; 28.12.2015
comment
@newpie, просто примечание, я знаю, что комментарий // - это просто вы показываете, что он работает с ручным вводом, но, пожалуйста, проверьте мое предложение и дайте мне знать .... - person FirstOne; 28.12.2015
comment
Здравствуйте, попробовал ваше предложение и без кубиков. Я подумал, может быть, это поможет, если я сделаю print_r результатов из ручного варианта по сравнению с тем, который не работает. Я добавлю его в конце моего поста выше. Насколько я могу судить, в Руководстве есть лишние пробелы и другие отличия от выборки. Спасибо за помощь - person newpie; 28.12.2015

Вкратце, это часть, которая решила проблему, включая оператор 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>

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

person newpie    schedule 28.12.2015