在PHP中循环获取数组值

我有一个数组$ 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']
});

Morris.js折线图

我的问题是,一旦我尝试使用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等于0
  • $i小于或等于count($data)-1(因此2-1 = 1,因此我们应该在循环中停留两次)
  • 显示此元素的ID和温度值
  • 递增$i

我在想什么或做错了什么?

同样,当我初始化$i为一个而不是零时,我可以获取$data数组中第二个条目的值

Morris.js图2

(我更愿意说我不是开发人员,因此此代码可能不是我同意的最干净的代码)

编辑:

  • 粘贴到以下网址var_dump$datahttp//pastebin.com/dYNtLxqX

  • 使用Forbs解决方案时的屏幕截图(根本不会加载图表): Morris.js图3

  • 我用来填充$dataArray的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_encodearray_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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章