PHP数组进入谷歌图表

时间:2015-01-13 13:59:19

标签: php json google-visualization

我需要一些帮助将PHP数据放入谷歌图表。

我创建了一个简单的数组

$chart_arr = array($year, $new_balance);
json_encode($chart_arr);    

如果我跑

<?php echo json_encode($chart_arr);?>    

我看到以下内容:[2015,1150] [2016,1304.5] [2017,1463.635] [2018,1627.54405] [2019,1796.3703715],所以我认为(?)我从我的forloop编码正确的数字生成$ year和$ new_balance。

我想在谷歌图表中列出这些数字

<script type="text/javascript">
google.load("visualization", "1", {packages:["corechart"]});
google.setOnLoadCallback(drawChart);

function drawChart() {


var data = new google.visualization.DataTable();
                data.addColumn('string', 'Year');
                data.addColumn('number', 'Balance');
                data.addRows([
                    <?php echo json_encode($chart_arr);?>
                ]);    

或者:

                data.addRows([
                <?php echo $chart_arr;?>
            ]);    

然后继续......

var options = {
              title: 'My Savings',
              curveType: 'function',
              legend: { position: 'bottom' } 
};

var chart = new google.visualization.LineChart(document.getElementById('curve_chart'));
chart.draw(data, options);

}    

显示为......

    <div class="grid-container"> 
    <div class="grid-100 grid-parent">
        <div id="curve_chart" style="width: 100%; height: auto"></div>
     </div>   

</div>

我尝试了很多变化,但要么没有将数据输入图表,要么没有显示图表。

有人可以帮助我显示我出错的地方吗?

我看到另一篇使用以下代码的相关帖子:

     $chartsdata[$i] = array($testTime, $testNb);
echo json_encode($chartsdata);

var jsonData = $.ajax({
        url: "test.php",
        dataType: "json",
        async: false
    }).responseText;

    var obj = JSON.stringify(jsonData);
    data.addRows(obj);

这是我需要关注的方法吗?

提前致谢

3 个答案:

答案 0 :(得分:4)

我发现你在第一个问题之后没有发现如何做到这一点,所以我在这里找到了一个有效的例子,希望这能帮助你戴夫:)。

如果您对此有疑问,请随时提问!

<?php 
//create array variable
$values = [];

//pushing some variables to the array so we can output something in this example.
array_push($values, array("year" => "2013", "newbalance" => "50"));
array_push($values, array("year" => "2014", "newbalance" => "90"));
array_push($values, array("year" => "2015", "newbalance" => "120"));

//counting the length of the array
$countArrayLength = count($values);

?>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("visualization", "1", {packages:["corechart"]});
google.setOnLoadCallback(drawChart);

function drawChart() {

    var data = new google.visualization.DataTable();
    data.addColumn('string', 'Year');
    data.addColumn('number', 'Balance');

    data.addRows([

    <?php
    for($i=0;$i<$countArrayLength;$i++){
        echo "['" . $values[$i]['year'] . "'," . $values[$i]['newbalance'] . "],";
    } 
    ?>
    ]);

    var options = {
        title: 'My Savings',
        curveType: 'function',
        legend: { position: 'bottom' } 
    };

    var chart = new google.visualization.LineChart(document.getElementById('curve_chart'));
    chart.draw(data, options);
}
</script>

<div class="grid-container"> 
<div class="grid-100 grid-parent">
    <div id="curve_chart" style="width: 100%; height: auto"></div>
</div>   

</div>

答案 1 :(得分:0)

我最近处理了Google Charts API,我提出了一些建议。您编写的PHP代码应该很有用,但它确实需要将您的Javascript代码嵌入到PHP页面中。

也许这对您的目的没有问题,但我建议您将Javascript与PHP分开。一些开发人员可能对一个开发人员感到满意,但另一个开发人员可能不熟悉,因此混合使用这两种语现在,这几乎让您使用AJAX来检索您的JSON图表数据。这是一个很好的方法,但我不喜欢你在问题中提到的代码,原因有几个。

首先,代码使用async: false,这将删除用户在获取数据时对浏览器的控制。换句话说,浏览器似乎会冻结,直到从AJAX请求返回数据。

另外,我不了解整个.responseText惯例。我理解代码的完成情况;我只是不明白为什么作者选择了这种特殊的方法。这就是我要做的事情。

$.ajax({
    url: "test.php",
    dataType: "JSON",
    data: [any POST parameters that you need here],
    type: "POST",
    success: function(json) {
        var jsonData = JSON.parse(json); // jsonData will be a Javascript object or array.
        data.addRows(jsonData);
        drawChart();
    },
    error: function(jxqhr) {
        // Handle a bad AJAX call
    }
});

那么这对整个应用程序有何帮助?好吧,在您的服务器端代码中,您可以通过响应带有HTTP 500错误的AJAX调用来处理任何错误(即错误的用户输入),并且AJAX调用可以将问题传达给您的用户。此外,当您的页面加载时,页面的其余部分将继续加载,而您的AJAX调用是关闭获取数据。

JS Fiddle

答案 2 :(得分:0)

json_encode工作得很好,你可以把它放在像var grafica = <?php echo json_encode($grafica); ?> ;这样的变量中(看下面我的例子)或者就像你把它放在你的例子中一样,除了它唯一的问题,就是你有双括号,jaso_encode($chart_arr)对象中的内容和外部data.addRows([ ... ]),为您提供[[...]]并生成和错误,取下括号,尝试这样:

 data.addRows(  
         <?php echo json_encode($chart_arr);?>  
           );

这个

  data.addRows([  
     <?php echo json_encode($chart_arr);?>  
       ]);

我已经包含了我如何使用它的示例,请注意在文档中(我认为可能更好)他们将整个代码放在<head>部分,因为它们拥有所有数据在那里,但这可能会导致实际工作示例出现问题,我只在<head><body> PHP代码之后的所有Javascript代码中放置了谷歌图表的CDN(内容交付网络),而不是为清晰起见,此示例中包含<div>,但最后一个可以在脚本标记之前。顺序很重要,因为在构建图形之前需要先获取数据。

我希望这会有所帮助。

<!DOCTYPE html>

    <head>

        <meta charset="utf-8"/>
        <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>

    </head>


<body>

<script type="text/javascript">

      google.charts.load("current", {packages:["corechart"]});       
      google.charts.setOnLoadCallback(drawChart);

      function drawChart() {

        var data = new google.visualization.DataTable();
       data.addColumn('string', 'fecha'); // Implicit domain column.
       data.addColumn('number', 'peso'); // Implicit data column.
       data.addColumn({type:'string', role:'annotation'}); // columna para anotaciones
       data.addColumn({type:'string', role:'style'});  // comumna para estilo


    var grafica =  <?php    echo json_encode($grafica);        ?> ;   

       data.addRows(grafica);


        var options = {
        title:'Peso Total', width:600,height:400,
        colors: ['#C0C0C0'],
        curveType: 'function',
          legend: 'none',
          pointSize: 12,
          annotations: {
                textStyle: {
                  fontName: 'Times-Roman',
                  fontSize: 32,
                  color: '#99ff99',
                  opacity: 0.5,
                }

              }

        };

        var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
        chart.draw(data, options);
      }
    </script>






 <div id="chart_div" style="margin: 80px auto; width: 650px; height: 450px; border: 2px solid #4CAF50; border-radius: 20px; padding:5px; "></div>


</html>