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="/bgcss/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 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 >harbour", "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] => )

Виждам две разлики направо, ръководството вмъква интервали около „данни“ и крайния параметър }.


person newpie    schedule 28.12.2015    source източник
comment
Това е JSON. Използване на json_encode()?   -  person frz3993    schedule 28.12.2015
comment
най-лесно ще бъде да изберете каквото искате (не използвайте SELECT *) и json_encode   -  person bansi    schedule 28.12.2015
comment
не трябва ли да завършим на }. Опитахте ли да го направите? $jsonEncodedData . '}'); за тестване?   -  person FirstOne    schedule 28.12.2015
comment
Изглежда, че това свърши работа! Благодаря FirstOne, ще публикувам отговор, за да обобщя. Оценявам търпението ви да ми помогнете.   -  person newpie    schedule 28.12.2015
comment
Няма проблем, маркирах вашия като отговор и +1, но можете да редактирате както желаете. Благодаря отново   -  person newpie    schedule 28.12.2015


Отговори (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