Как включить PHP в Javascript;Google Chart API - PullRequest
3 голосов
/ 10 декабря 2011

Я работаю с API визуализации карт Google.

У меня есть переменная в php:

`$value` 

, который содержит следующее: ['0', 0, 0], ['1', 65, 35], ['2', 88, 35], ['3', 66, 35], ['4', 35, 35], ['5', 99, 100]

Я хочу использовать это $value ниже в data.addRows следующим образом, однако вывод, который я получаю, является пустым

<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', 'Period');
    data.addColumn('number', 'Sales');
    data.addColumn('number', 'Expenses');
    data.addRows([ 

   <?php echo $value ?>

            ]);

    var options = {
      width: 400, height: 240,
      title: 'Company Performance'
    };

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

После некоторых исследований кажется, что я пытаюсь попробовать Ajax. Это правильно? Есть ли простой способ вернуть значение $value в data.addRow ??

Вот процесс, для которого установлено значение $:

$i = "0";   
$period = "0";
$chartrow = array();
$unitpriceNumR = 3

while ($i<3)

{


$chartrow[$i] = "['".$period."',".$sPrice[$i].", ".$uPrice[$i]."]";


$period++;
$i++;

}

switch ($currentStage)
{

case "0":

$value = $chartrow[0];
    break;



case "1":

$value = $chartrow[0];  
    break;



case "2":

$value = $chartrow[0].",".$chartrow[1];
    break;


}

В этом примере, если $currentStage = "2", тогда $value установлено в ['0', 0, 0], ['1', 65, 35]

Хорошо, теперь я даже попытался скопировать и вставить код Google в мой файл, но все еще не смог увидеть график. (код взят из: http://code.google.com/intl/en-EN/apis/chart/interactive/docs/gallery/linechart.html)

<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', 'Sales');
    data.addColumn('number', 'Expenses');
    data.addRows([
      ['2004', 1000, 400],
      ['2005', 1170, 460],
      ['2006',  860, 580],
      ['2007', 1030, 540]
    ]);

    var options = {
      width: 400, height: 240,
      title: 'Company Performance'
    };

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

Используя этот код

$chartrow = array();


for ($i = 0; $i < 3; $i++ )
{
$chartrow[] = array((string) $i, $sPrice[$i], $uPrice[$i]);
echo $chartrow;

}

приводит к тому, что $ chartrow выводит слово "Array" на экран.

Ответы [ 4 ]

2 голосов
/ 10 декабря 2011

Изменить [<?php echo $value ?>] на <?php echo json_encode($value) ?>

echo $value создает Array(5), поскольку PHP изначально не знает, как представить массив в виде строки.

echo json_encode($value) производит:

[['0',0, 0],['1',65,35],['2',66,35],['4',35,35],['5',99, 100]]

так что вам не нужны скобки вокруг <?php ... ?>.

http://php.net/manual/en/function.json-encode.php

РЕДАКТИРОВАТЬ: спасибо за разъяснение, как формируются переменные PHP.

Проблема в том, что вы вручную конвертируете массивы в строки, когда вы должны позволить $json_encode сделать всю работу за вас.

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

$chartrow = array();
$unitpriceNumR = 3;

for ($i=0; $i<=2; $i++)
    $chart_row[$i] = array($i, $sPrice[$i], $uPrice[$i];

switch ($currentStage)
{
    case '0':
    case '1':
        $value = $chartrow[0];
        break;

    case '2':
        $value = array($chartrow[0], $chartrow[1]);
        break;
}

EDIT2: Я попробовал то, что вы сделали (заменив блок php на то, что мы ожидаем, что блок php произведет), и у меня это тоже не сработало. Firebug говорит «Контейнер не определен» в собственном коде Google.

Вы забыли добавить div к вашему документу. Добавьте <div id='chart_div'></div> после script.

Итак, мы на одной странице: http://jsfiddle.net/daemon/nnpeE/

2 голосов
/ 10 декабря 2011

Пожалуйста, посмотрите на функцию кодирования JSON , предоставляемую с PHP.Это позволит вам echo или print из JSON-кодированной строки, которую JavaScript преобразует в собственный объект.

$value = array(
    array('0', 0, 0),
    array('1', 65, 35),
    array('2', 88, 35),
    ...
);

...
data.addColumn('number', 'Sales');
data.addColumn('number', 'Expenses');
// Change this and the following lines to:
data.addRows(<?php print json_encode($value); ?>);

EDIT

$i = 0; 
$chartrow = array();
$unitpriceNumR = 3

for (; $i < 3; $i++ )
    $chartrow[] = array((string) $i, $sPrice[$i], $uPrice[$i]);

switch ($currentStage) {
    case "0":
    case "1":
        $value = $chartrow[0]; 
        break;

    case "2":
        $value = array_slice($chartrow, 0, 2);

    default:
        // You should have some default value, seriously!!!
}

// Then go the json_encode way, it's safer and easier to maintain!
...
data.addColumn('number', 'Sales');
data.addColumn('number', 'Expenses');

// Change this and the following lines to:
data.addRows(<?php print json_encode($value); ?>);
0 голосов
/ 10 декабря 2011
0 голосов
/ 10 декабря 2011

Всякий раз, когда у меня есть такие значения, я делаю это в качестве своего первого скрипта на странице, и это, кажется, работает для меня. Это также позволяет мне проверять, что происходит с PHP, а не скрывать переменную в какой-то функции. Обратите внимание, что это создаст глобальную переменную, которая может быть не той, которую вы хотите.

<script>
var a = [<?php echo($var1) ?>];
</script>

EDIT:
Я получил твой PHP-код для меня. Изменения, которые я сделал, я преобразовал $i в 0, а не "0" То же самое касается оператора switch. Кроме того, строка 4 требует точки с запятой после нее. Затем я положил это

<script>
var a = [<?php echo($value) ?>];
</script>

И вывод на странице был

<script>
var a = [['0',, ],['1',, ]];
</script>
...