Javascript 在PHP中获取循环中的数组值
我有一个数组$data,其组成如下:Javascript 在PHP中获取循环中的数组值,javascript,php,arrays,morris.js,Javascript,Php,Arrays,Morris.js,我有一个数组$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_0
$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'];
我在这个数组中只有两个元素,所以echoccount($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++; }?>},
],
使用while循环使用此查询填充数组
$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++;
}
你的问题在循环中
while ($i <= count($data)-1)
while($i您可以进一步优化它
Morris.Line({
element: 'morris-area-chart',
data: [
<?php
foreach($data as $sensor) {
foreach($sensor as $key => $value) {
if($key == 'id') {
$id = $value;
} else {
$tempTime[$key][$id] = $value;
}
}
}
$i = 0;
foreach($tempTime as $time) {
echo sprintf("{ y: '%02dh', ",$i);
foreach($time as $key => $value) {
echo sprintf("%d:%d, ",$key, round($value,2);
}
echo "},";
$i++;
}
?>
],
xkey: 'y',
parseTime:false,
ykeys: [1,2,3],
pointSize: 2,
hideHover: 'auto',
labels: ['Capteur X', 'Capteur Y']
});
Morris.Line({
元素:“莫里斯面积图”,
数据:[
这是我对另一种方法的建议,它减少了重复的代码,并最小化了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;
}
}
然后将$data
数组转换为字符串:
$data = implode(",\n", $data);
这样,JS部分中需要的所有PHP都是:
Morris.Line({
element: 'morris-area-chart',
data: [ <?php echo $data ?> ]
然后可以使用json\u encode
形成$data
(array\u value
用于使用数字索引重新索引数组,因此它将在json输出中呈现为数组,而不是对象。)
在JS中:
Morris.Line({
element: 'morris-area-chart',
data: <?php echo $data ?>
// note: no [] brackets around $data in this version
而不是
{ y: '01', 1: 17.62, 2: 19.52 }
我认为它可能无论如何都会起作用。发布一个var_dump
你的$data
var你正在使用$s
而不是$I
,$data[$s]['temp\u 00']
,也许这就是问题所在。我已经更新了帖子;这个$I
/$s
错误是由于我尝试了很多故障排除,但不幸的是,这不是问题所在。我还向数组var_dumps添加了一个粘贴箱,$row
来自哪里?数据库查询?如果您可以再添加一点代码来显示的话关于如何填充$row
的更多信息,我可以向您展示一种不同的方法来将数据从PHP传递到JS,这可能会更简单。我已经用我用来填充$data
数组的SQL查询更新了主要帖子。但是,因为我可以在手动执行$data
数组时获得存储在$data
数组中的值
或echo$data[1]['temp_00']
我认为它没有链接:/不幸的是,它不起作用;我(再次)尝试了所有这些解决方案都不起作用。当你使用这些数据时,你看到了什么?你能复制一份最终的php输出吗?只是morris Stuff我在使用你的解决方案时用输出的屏幕截图编辑了主要帖子这是php代码,我指的是屏幕输出的内容(在源代码中)在你运行它之后,我需要一分钟的时间将代码恢复为你的解决方案,并截图,然后编辑帖子:)你介意向我解释一下这个代码是如何工作的吗?我可以在我的图表上得到我的两行,但这不是正确的值,所以我想看看哪里出了问题。正如所说的,我不是一个编码器,我对foreach循环一点也不熟悉。我已经编辑了答案。输出是什么?哪里出了问题?谢谢你的解释。错误是abo但我认为值的顺序是这样的,因为数据库中的一些null
值设置为图表上的某个值,反之亦然。它使用的是“不要惊慌”解决方案,但我感谢您花时间帮助我:)我希望我能给你不止一次投票权!你是个天才,非常感谢这个解决方案!最后一件事:我的数据库中有一些null
值(看看主帖子中的粘贴栏),我希望那些null
值在莫里斯图表中设置为“null”,而不是“0”(现在是这样),这将通过不在零处绘制直线来防止直线下降到零处all@William我更新了答案。事实上,我刚刚意识到有更好的方法。我将在一分钟内再次编辑。您提供的新代码对我不起作用:第44行的C:\wamp64\www\project\data\data.php中的未定义索引:id
。因为我没有Clue您的代码如何工作我不知道如何让它在我的设置中工作x)第44行是for循环的结束括号我认为$times[$x][]=$row['id'].:'。$temp;
应该是$times[$x][=$row['iddevice'].:“.$temp;
还是我错了?不,你是对的,XerXeX。@William I更新了答案以修复该拼写错误。我还添加了另一种可能的方法,使用json\u encode
完成此操作。
$data = implode(",\n", $data);
Morris.Line({
element: 'morris-area-chart',
data: [ <?php echo $data ?> ]
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($times));
Morris.Line({
element: 'morris-area-chart',
data: <?php echo $data ?>
// note: no [] brackets around $data in this version
{ "y": "01", "1": 17.62, "2": 19.52 }
{ y: '01', 1: 17.62, 2: 19.52 }