我试图让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(),但我无法确切地知道在哪里。
答案 0 :(得分:2)
您的代码中存在一些问题
mysql_fetch_assoc
返回一个数组。要在sqls where
语句中使用它,您需要从中获取价值。否则它将序列化为字符串“Array”,这不是您要寻找的疾病。
array_values
只能使用1.如果你传递2个参数,它不会提取任何值(至少在php 5.6.21中它只打印警告)。
在$data
变量中,您有一个这样的数组数组
[[lat,lng,magnitude],[lat,lng,magnitude],...]
。如果您尝试从此数组中提取值,它将创建一个与$data
中存储的数组完全相同的新数组。您需要合并所有子数组。
像这样的例子call_user_func_array( 'array_merge', $data );
或者将它们合并在内循环中。
接下来的问题更多地是关于你的代码风格。
Mysql extension is deprecated最好使用Mysqli或PDO。
Mysql(也是pdo和mysqli)有method,它将值提取为简单的枚举数组。所以你不需要致电array_values
在内循环中。
It's may be unsafe to pass string data (even if it comes from trusted source) into sql没有转义特殊符号。
试试这个。
$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 = []
,然后才能从内部查询中获取更多数据。
顺便说一下,我确定,您将找到一种方法在一个查询中获取该数据,并在以后将其带入所需的数组结构。