PHP动态解析嵌套多维JSON数组
我的服务器上有多个JSON文件需要解析,然后将解析后的数据插入数据库。对于每个文件,我需要解析嵌套的“数据集”集合数组,该数组也包含多个嵌套数组,然后将多个嵌套数组中的数据插入到我的数据库中 每个文件都包含不同且不断变化的嵌套数据集,因此我试图编写一个脚本,该脚本将使用数组中的数据动态构建sql insert语句 示例JSON数据PHP动态解析嵌套多维JSON数组,php,mysql,json,parsing,multidimensional-array,Php,Mysql,Json,Parsing,Multidimensional Array,我的服务器上有多个JSON文件需要解析,然后将解析后的数据插入数据库。对于每个文件,我需要解析嵌套的“数据集”集合数组,该数组也包含多个嵌套数组,然后将多个嵌套数组中的数据插入到我的数据库中 每个文件都包含不同且不断变化的嵌套数据集,因此我试图编写一个脚本,该脚本将使用数组中的数据动态构建sql insert语句 示例JSON数据 { "title" : "Exported Data", "timestamp":"3/17/2017 10:35:13 PM", // I need the
{
"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);
}
}
}
}
}
$the_array=json_decode($json,true);
$topdata=新的递归数组迭代器(_数组);
$start='插入';
foreach($topdataas$key=>$value)
{
如果($key=='timestamp')
{
$timestamp=strottime($value);
}
如果($key=='datasets')
{
foreach($k=>v的值)
{
foreach($v为$k2=>$v2)
{
foreach($v2作为$dataset=>$dsvalue)
{
$col='';
$val='';
foreach($dsvalue作为$dskey=>$dsval)
{
$col.=$dskey.,';
$val.=$dsval.,';
//回显“$dskey=>$dsval
”;
}
$col=rtrim($col,“,”);
$val=rtrim($val,“,”);
$sql=$start.$k2.'(日期,'.$col.')值('.$timestamp.','.$val.');
//回显$sql。“
”;
//$q=新查询();
//$q->insertDB($sql);
}
}
}
}
}
我希望有人能向我展示一种更好或更有效的写作方法,它不包括五个嵌套的foreach语句
此外,我不确定我是否正确处理了时间戳的转换。稍后,我将结合DateDiff/DateAdd使用此列来查找时段之间的数据。如果当前的方法不正确,什么是正确的
提前感谢您的时间和回复。应该会对您有所帮助,至少有一点。谢谢GMC。这确实有点帮助。