Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在PHP中获取循环中的数组值_Javascript_Php_Arrays_Morris.js - Fatal编程技术网

Javascript 在PHP中获取循环中的数组值

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,其组成如下:

$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 }