Mysql到JSON,如何获得嵌套数组?

时间:2016-06-21 13:54:42

标签: php mysql json

我试图让JSON文件看起来像这样:

[
    [
    'Disease', [ latitude, longitude, magnitude, latitude, longitude, magnitude, ... ]
    ],
    [
    'Disease', [ latitude, longitude, magnitude, latitude, longitude, magnitude, ... ]
    ]
];

这就是我所做的:

<?php

    $sqlDisease = mysql_query("SELECT DISTINCT Disease FROM DiseaseData") or die(mysql_error());

    while($rowDisease = mysql_fetch_assoc($sqlDisease)){

            $sqlData = mysql_query("
            SELECT lat, lng, magnitude 
            FROM DiseaseData 
            WHERE Disease = '".$rowDisease."'") 
            or die(mysql_error());

            while($rowData = mysql_fetch_assoc($sqlData)){
                $data[] = array_values($rowData);
            }

            $result[] =  array_values($rowDisease, $data);

    }

    $json = json_encode($result);
    $file = 'testRes.json';
    file_put_contents($file, $json);

我最终得到了一个类似这样的JSON文件:

[null,null,null]

问题可能在于嵌套的while循环或array_values(),但我无法确切地知道在哪里。

2 个答案:

答案 0 :(得分:2)

您的代码中存在一些问题

  1. mysql_fetch_assoc返回一个数组。要在sqls where语句中使用它,您需要从中获取价值。否则它将序列化为字符串“Array”,这不是您要寻找的疾病。

  2. array_values只能使用1.如果你传递2个参数,它不会提取任何值(至少在php 5.6.21中它只打印警告)。

  3. $data变量中,您有一个这样的数组数组 [[lat,lng,magnitude],[lat,lng,magnitude],...]。如果您尝试从此数组中提取值,它将创建一个与$data中存储的数组完全相同的新数组。您需要合并所有子数组。 像这样的例子call_user_func_array( 'array_merge', $data ); 或者将它们合并在内循环中。

  4. 接下来的问题更多地是关于你的代码风格。

    1. Mysql extension is deprecated最好使用Mysqli或PDO。

    2. Mysql(也是pdo和mysqli)有method,它将值提取为简单的枚举数组。所以你不需要致电array_values 在内循环中。

    3. It's may be unsafe to pass string data (even if it comes from trusted source) into sql没有转义特殊符号。

    4. 试试这个。

      $sqlDisease = mysql_query("SELECT DISTINCT Disease FROM DiseaseData") or die(mysql_error());
      
      $result = [];
      while($rowDisease = mysql_fetch_assoc($sqlDisease)){
              $theDisease = $rowDisease['Disease'];
              $sqlData = mysql_query("
              SELECT lat, lng, magnitude 
              FROM DiseaseData 
              WHERE Disease = '".mysql_real_escape_string($theDisease)."'") 
              or die(mysql_error());
              $data = [];
              while($rowData = mysql_fetch_row($sqlData)){
                  $data[] = $rowData;
              }
              $mergedData = call_user_func_array( 'array_merge', $data );
              $result[] =  [$theDisease, $mergedData];
      }
      
      $json = json_encode($result);
      $file = 'testRes.json';
      file_put_contents($file, $json);
      

答案 1 :(得分:1)

由于

,您的内部选择失败
WHERE Disease = '".$rowDisease."'") 

$ rowDisease是一个数组。尝试:

WHERE Disease = '".$rowDisease['Disease']."'") 

@Alex是正确的,您的$data不断增长,您需要重置$data = [],然后才能从内部查询中获取更多数据。

顺便说一下,我确定,您将找到一种方法在一个查询中获取该数据,并在以后将其带入所需的数组结构。