2013-01-31 160 views
0

我正在尝试制作一个Graph(通过Google Charts),它在过去24小时内在我的服务器上显示用户活动。用户活动的数据每隔15分钟(通过cron)提取并存储在本地数据库中。由于数据库每15分钟更新一次,因此该图不是静态的。在Javascript循环中增加PHP变量

该图显然需要一些数字作为输入以便绘制。这里是JavaScript作品的一个简单的例子:

dataTable.setValue(0, 0, 0); 
dataTable.setValue(1, 0, 25.0); 
dataTable.setValue(2, 0, 50.0); 
dataTable.setValue(3, 0, 75.0); 
dataTable.setValue(4, 0, 100.0); 

上面的代码将绘制的对角线从(X,Y)=(0,0),并且在(X,Y)=结束(4100)

所以我现在要做的是做96次循环(每15分钟更新24小时= 15 x 24 = 96)。

因此,这里是我的尝试:

for(x=0;x<96;x++){ //copy PHP array into javascript array 
    javaArray[x] = <?php echo $sqlArray[$count]['clients_online'];?>; 
    <?php $cnt++; ?> 
} 
for (var x=0;x<96;x++){ //draw graph 
     dataTable.setValue(x, 0, javaArray[x]); 
} 

在第一次for循环,我从PHP数组传递数据(从数据库中获取)成JavaScript数组。完成后,我在第二个for循环中绘制图形。

$ count变量在for循环内正确增加,但我的问题是它在每个循环后重置

我知道PHP是服务器端,而javascript是客户端,因此问题,但我该如何解决这个问题?

谢谢。

+0

为什么所有的计数变量?您可以将服务器端PHP数组传递给JavaScript,并使用JSON'<?php $ arr = array(1,2,3,4); ?>/* Javascript */js_arr = JSON.parse(<?php json_encode($ arr);?>);'。从问题中提供的信息中,我无​​法确定哪个计数变量正在改变;但我看到一个PHP数量变量没有被传递给JavaScript,是吗? –

+0

15 x 24!= 96,你想说的是4 * 24 = 96或者为了更简单的理解60/15 * 24 –

回答

1

您可以循环访问$sqlArray,将密钥用作计数器,并在每次迭代中输出js。

<?php 
foreach($sqlArray as $count => $val) 
{ 
?> 
    dataTable.setValue(<?php echo $count; ?>,0,<?php echo $val['clients_online']; ?>); 
<?php 
} 
?> 

这将工作提供了类似下面

Array 
(
    [0] => Array 
    (
     [clients_online] => 44 
    ) 

    ... 
    [95] => Array 
    (
     [clients_online] => 66 
    ) 

和你预期的输出数组数据应该是这样的

dataTable.setValue(0,0,44); 
    ... 
    dataTable.setValue(95,0,66); 
+0

非常感谢!它像一个魅力一样工作! – Chris

0

首先,我建议有实际存储在数据库中的时间(因此谷歌图表也理解它,并可以绘制轴)。但是,要解决你的数据从PHP传递给JS问题,你可以只json_encode你的阵列,它传递给使用Javascript,如:

<?php 
    $data = array (
    array('Iterator', 'Visitors'), 
    array(1, 25), 
    array(2, 23), 
    array(3, 17), 
    array(4, 22), 
    array(5, 15), 
    array(6, 19), 
    array(7, 17), 
    array(8, 19), 
); 
?> 

而且JS/HTML侧

var dataTable = <?= json_encode($data); ?>; // <?= is short for <?php echo - always available from 5.4 

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

function drawChart() { 

    var data = google.visualization.arrayToDataTable(dataArray); 

    var options = { 
     title: 'Visitors by 15min iterator' 
    }; 

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

的jsfiddle例子是在这里:http://jsfiddle.net/hTKGK/1/

1

对于这些类型的事情,最好做一个Ajax调用。这允许解耦前端和后端代码,这是您首先关注的问题之一。

以下是可用于转储变量的PHP。我们称之为ajax-data-table.php。如果你的sqlArray有不同的布局,你可以相应地改变它。

<?php 

$sqlArray = array(
    0 => 0.0, 
    1 => 25.0, 
    2 => 50.0, 
    3 => 75.0, 
    4 => 100.0, 
); 

echo json_encode($sqlArray, JSON_FORCE_OBJECT); 

当它使得它看起来就像这样:

{"0":0,"1":25,"2":50,"3":75,"4":100} 

然后,您可以用JS做使用AJAX调用。假设你有jQuery:

request = $.getJSON('ajax-data-table.php'); 
var dataTable = request.responseText.evalJSON();