我的服务器上有多个JSON文件需要解析,然后将解析后的数据插入到我的数据库中。对于每个文件,我需要解析嵌套的“数据集”集数组,该数组还包含多个嵌套数组,然后将多个嵌套数组中的数据插入到我的数据库中。
每个文件都包含不同且不断变化的嵌套数据集,因此我尝试编写一个脚本,该脚本将使用数组中的数据动态构建sql insert语句。
示例JSON数据
{
"title" : "Exported Data",
"timestamp":"3/17/2017 10:35:13 PM", // I need the date from this string timestamp
"description":"this is unused",
"datasets":[
{
"ab":[{ // I need this key value “ab” for the table name
"STID":"1", // I need both the “STID” for the column name, and the value for the record row
"qty":"440",
"bal":"532882.71",
"rem":"11.52"
},
{
"STID":"2",
"qty":"393",
"bal":"406825.45",
"rem":"11.16"
},
{
"STID":"3",
"qty":"517",
"bal":"556259.82",
"rem":"11.13"
}]
},
{
"act":[{
"STID":"1",
"BEG":"586",
"DEL":"2",
"RET":"3",
"EBO":"1",
"PO":"0",
"CO":"0",
"TX":"2",
"RX":"3",
"CUR":"584",
"PTD":"-2",
"WTD":"-19",
"MTD":"-6"
},
{
"STID":"2",
"BEG":"519",
"DEL":"12",
"RET":"2",
"EBO":"1",
"PO":"0",
"CO":"0",
"TX":"0",
"RX":"0",
"CUR":"528",
"PTD":"9",
"WTD":"-3",
"MTD":"65"
},
{
"STID":"3",
"BEG":"682",
"DEL":"6",
"RET":"4",
"EBO":"2",
"PO":"0",
"CO":"0",
"TX":"0",
"RX":"0",
"CUR":"682",
"PTD":"0",
"WTD":"2",
"MTD":"22"
}]
},
{
"cashproj":[{
"STID":"1",
"DlyProj":"2542.4025",
"RentCol":"1090.33",
"PerCol":"42.8858"
},
{
"STID":"2",
"DlyProj":"1893.44",
"RentCol":"2214.48",
"PerCol":"116.9553"
},
{
"STID":"3",
"DlyProj":"2614.24",
"RentCol":"1508.06",
"PerCol":"57.6863"
}]
}
]}
-
MySQL表的名称与数据集的嵌套数组键相同(即“ab”,“act”,“cashproj”等等。)
对于每个数据集,我想循环遍历每个嵌套数组,然后使用来自顶级数组键值,数据集键名称,然后是数据集数组键和值的数据创建并运行sql查询,例如:
这就是我目前所拥有的:
$the_array = json_decode($json, true);
$topdata = new RecursiveArrayIterator($the_array);
$start = 'INSERT INTO ';
foreach ($topdata as $key => $value)
{
if($key == 'timestamp')
{
$timestamp = strtotime($value);
}
if($key == 'datasets')
{
foreach ($value as $k => $v)
{
foreach ($v as $k2 => $v2)
{
foreach ($v2 as $dataset => $dsvalue)
{
$col = '';
$val = '';
foreach ($dsvalue as $dskey => $dsval)
{
$col .= $dskey . ', ';
$val .= $dsval . ', ';
// echo "$dskey => $dsval <br>";
}
$col = rtrim($col,", ");
$val = rtrim($val,", ");
$sql = $start . $k2 . ' (date, ' . $col . ') VALUES (' . $timestamp . ', ' . $val . ')';
// echo $sql . '<br><br>';
// $q = new Query();
// $q->insertDB($sql);
}
}
}
}
}
我希望有人能告诉我一个更好或更有效的写作方法,不包括五个嵌套的foreach语句。
此外,我不确定我是否正确处理时间戳的转换。稍后我将结合DateDiff / DateAdd使用此列来查找句点之间的数据。如果目前的方法不对,那是什么?
提前感谢您的时间和回应。