我有一个数组$ data组成如下:
$data[$k]['id'] = $row['iddevice'];
$data[$k]['temp_00'] = $row['temp_00'];
$data[$k]['temp_01'] = $row['temp_01'];
$data[$k]['temp_02'] = $row['temp_02'];
$data[$k]['temp_03'] = $row['temp_03'];
$data[$k]['temp_04'] = $row['temp_04'];
我在这个数组中只有两个元素,所以echo count($data);
返回2
我在下面的工作代码示例下使用Morris.js创建折线图:
$(function() {
Morris.Line({
element: 'morris-area-chart',
data: [
{ y: '00h', 1:57, 2:41},
{ y: '01h', 1:62, 2:98},
{ y: '02h', 1:44, 2:43},
{ y: '03h', 1:67, 2:84},
],
xkey: 'y',
parseTime:false,
ykeys: [1,2,3],
pointSize: 2,
hideHover: 'auto',
labels: ['Capteur X', 'Capteur Y']
});
我的问题是,一旦我尝试使用PHP来使用我的值,$data
它将不起作用,图表将不会加载任何值。
Morris.Line({
element: 'morris-area-chart',
data: [
{ y: '00h', <?php $i = 0; while ($i <= count($data)-1) { echo $data[$i]['id'].":".round($data[$i]['temp_00'],2); $i++; }?>},
{ y: '01h', <?php $i = 0; while ($i <= count($data)-1) { echo $data[$i]['id'].":".round($data[$i]['temp_01'],2); $i++; }?>},
{ y: '02h', <?php $i = 0; while ($i <= count($data)-1) { echo $data[$i]['id'].":".round($data[$i]['temp_02'],2); $i++; }?>},
{ y: '03h', <?php $i = 0; while ($i <= count($data)-1) { echo $data[$i]['id'].":".round($data[$i]['temp_03'],2); $i++; }?>},
],
对我来说,算法很好:
$i
小于或等于count($data)-1
(因此2-1 = 1,因此我们应该在循环中停留两次)$i
一我在想什么或做错了什么?
同样,当我初始化$i
为一个而不是零时,我可以获取$data
数组中第二个条目的值
(我更愿意说我不是开发人员,因此此代码可能不是我同意的最干净的代码)
编辑:
粘贴到以下网址var_dump
的$data
:http://pastebin.com/dYNtLxqX
我用来填充$data
Array的SQL查询:
select iddevice, data.ip, type, description,
avg(case when hour(date) = 00 then temp end) as temp_00,
avg(case when hour(date) = 01 then temp end) as temp_01,
avg(case when hour(date) = 02 then temp end) as temp_02,
...
avg(case when hour(date) = 22 then temp end) as temp_22,
avg(case when hour(date) = 23 then temp end) as temp_23
from data, device
where date >= '2017-03-20' and
date < '2017-03-21' and
device.ip = data.ip
group by ip
order by iddevice;
使用while循环使用此查询填充Array
$results = $conn->query($sql);
$k = 0;
$data = array();
while ($row = $results->fetch_assoc()) {
$data[$k]['temp_00'] = $row['temp_00'];
$data[$k]['temp_01'] = $row['temp_01'];
$data[$k]['temp_02'] = $row['temp_02'];
$data[$k]['temp_03'] = $row['temp_03'];
...
$k++;
}
这是我建议的另一种方法。它减少了重复的代码,并最大程度地减少了PHP / JS的混合。
首先,从查询中获取行时,构建数组的方式有所不同:
while ($row = $results->fetch_assoc()) {
// Loop over each of the temp_x columns
for ($i=0; $i < 4; $i++) {
$x = str_pad($i, 2, '0', STR_PAD_LEFT);
// add the value for each temp_x to a temporary array, using time for a key
$temp = is_null($row["temp_$x"]) ? 'null' : round($row["temp_$x"], 2);
$times[$x][] = $row['iddevice'] . ':' . $temp;
}
}
接下来,格式化临时数组中每个数组的值
foreach ($times as $time => $temps) {
$data[] = "{ y: '{$time}h', " . implode(', ', $temps) . '}';
}
然后将$data
数组转换为字符串:
$data = implode(",\n", $data);
这样,您在JS部分需要的所有PHP是:
Morris.Line({
element: 'morris-area-chart',
data: [ <?php echo $data ?> ]
使用可能会有更好的方法json_encode
。如果您在while
循环中更改从数据库中获取行的代码,只需执行以下操作:
for ($i=0; $i < 4; $i++) {
$x = str_pad($i, 2, '0', STR_PAD_LEFT);
$temp = is_null($row["temp_$x"]) ? null : round($row["temp_$x"], 2);
$times[$x]['y'] = $x.'h';
$times[$x][$row['iddevice']] = $temp;
}
然后$data
可以使用形成json_encode
。(array_values
用于将数组与数字索引重新索引,因此它将在JSON输出中呈现为数组而不是对象。)
$data = json_encode(array_values($times));
在JS中:
Morris.Line({
element: 'morris-area-chart',
data: <?php echo $data ?>
// note: no [] brackets around $data in this version
这是否有效取决于所有键都是字符串是否可以,因为JSON键是字符串,所以您将获得如下输出
{ "y": "01", "1": 17.62, "2": 19.52 }
代替
{ y: '01', 1: 17.62, 2: 19.52 }
我认为它可能仍然应该起作用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句