PHP动态解析嵌套的多维JSON数组

时间:2017-03-18 09:18:56

标签: php mysql json parsing multidimensional-array

我的服务器上有多个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使用此列来查找句点之间的数据。如果目前的方法不对,那是什么?

提前感谢您的时间和回应。

0 个答案:

没有答案