用JS解析JS数组,然后将其传递给PHP

时间:2014-12-21 20:13:39

标签: javascript php arrays json javascript-objects

我正在制作一个计算荷兰公路税的系统,因为我有一些JS数组(数据在哪里)我用JS解析(所有这些都在同一时间,因为它是一样的数据格式),然后使用XMLHttpRequest对象将其作为JSON格式传递给PHP。

为此,我首先制作了这个数据映射器:

var roadTaxData = {
    provinceWeightFuelPricesData: {
        personen_auto: {
            noord_holland: dataNoordHolland,
            zeeland: dataZeeland
            //TODO: Add all the provinces with it's data to the personen_auto object
        },
        kampeer_auto: {
            noord_holland: dataNoordHolland2,
            zeeland: dataZeeland2
        }
    }
}

格式为:

  • 车辆类型
  • 哪个省
  • 该数据属于该省。

然后我将这个小解析器解析为数组:

/*
 Loop through all the specific vehicle types inside the provinceWeightFuelPricesData object
 */
for (var vehicleType in roadTaxData.provinceWeightFuelPricesData) {
    /*
        Where the data is getting stored for each vehicle type
     */
    var data = {},
        /*
            Every province with its data contained in the vehicle type
         */
        provinces = roadTaxData.provinceWeightFuelPricesData[vehicleType];

    /*
     Loop through all province's with its data in the specific vehicle type
     */
    for (var province in provinces) {
        /*
         Define each province data
         */
        var provinceData = provinces[province];
        /*
         Add the province to the object as an key
         */
        data[province] = [];
        /*
         Loop through the data which belongs to every province
         */
        for (var provinceDataIndex = 0; provinceDataIndex < provinceData.length; provinceDataIndex++) {

            /*
             Add the province data to the array
             */
            data[province].push(provinceData[provinceDataIndex]);
        }
        console.log('Parsed a the province: ' + province + " from the vehicle type " + vehicleType);
        console.log('');
    }
    console.log('Parsed the vehicle type: ' + vehicleType);
    console.log('');
    console.log(data);
    passToPHP(vehicleType, JSON.stringify(data));
}

这一切都很好,当我这样做时,我会用数据返回正确的数组:

console.log(data);

但是当我用这种方法将它传递给PHP时:

function passToPHP (paramName, data) {
    if (typeof paramName === "string" && typeof data === "string") {
        var httpc = new XMLHttpRequest(); // simplified for clarity"
        httpc.open("POST", INSTALL_FILE, true); // sending as POST

        httpc.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

        /*
         For testing
         */
        httpc.onreadystatechange = function () { //Call a function when the state changes.
            if (httpc.readyState == 4 && httpc.status == 200) { // complete and no errors
                console.log(httpc.responseText); // some processing here, or whatever you want to do with the response
            }
        };
        httpc.send(paramName + "=" + data);
    }
}

使用这个PHP文件:

header('Content-Type: application/json');

$personen_auto = $_POST['personen_auto'];
$kampeer_auto  = $_POST['kampeer_auto'];


print_r(json_decode($personen_auto));
print_r(json_decode($kampeer_auto));

我首先收到此错误,但未重新合并kampeer_auto的{​​{1}}索引,我实际发送的是{<1}}:

  


注意:未定义的索引:kampeer_auto in    C:\ Users \ Bas \ Documents .. \ Cars \ install.php 6

然后是personen_auto对象的数据日志。

然后这个消息又出现了一个错误,它没有重新解析$_POST索引,我刚刚解析并打印出来了?

  


通知:未定义的索引:personen_auto in    C:\ Users \ Bas \ Documents .. \ Cars \ install.php 5

问题

  • 如何解决这些personen_auto变量?
  • 我如何能够让PHP在当时只收到1 $ _POST索引?

我自己尝试

我已经尝试将passPHP()方法放在for循环之外,如下所示:

$_POST

但是只传递了一个变量到PHP(/* Loop through all the specific vehicle types inside the provinceWeightFuelPricesData object */ for (var vehicleType in roadTaxData.provinceWeightFuelPricesData) { /* Where the data is getting stored for each vehicle type */ var data = {}, /* Every province with its data contained in the vehicle type */ provinces = roadTaxData.provinceWeightFuelPricesData[vehicleType]; /* Loop through all province's with its data in the specific vehicle type */ for (var province in provinces) { /* Define each province data */ var provinceData = provinces[province]; /* Add the province to the object as an key */ data[province] = []; /* Loop through the data which belongs to every province */ for (var provinceDataIndex = 0; provinceDataIndex < provinceData.length; provinceDataIndex++) { /* Add the province data to the array */ data[province].push(provinceData[provinceDataIndex]); } console.log('Parsed the province: ' + province + " from the vehicle type " + vehicleType); console.log(''); } console.log('Parsed the vehicle type: ' + vehicleType); console.log(''); //console.log(data); } passToPHP(vehicleType, JSON.stringify(data)); )。

3 个答案:

答案 0 :(得分:1)

尝试将数据作为未解析的json字符串传递给php,并使用json_decode显式解析它。

因此发送一个$ _POST参数json=string(字符串是数据的urlencoded JSON.stringify),并使用php解码json_decode($_POST['json'], true)。那应该返回一个代表js对象的数组。

答案 1 :(得分:1)

尝试在循环外部放置数据声明。它目前正在为roadTaxData.provinceWeightFuelPricesData中的每个条目重置/清除,因此您只会将最后一个条目发送到服务器。

var data = {};

for (var vehicleType in roadTaxData.provinceWeightFuelPricesData) {

然后,正如@Andras建议的那样,您需要在服务器端解码JSON:

$data = json_decode( $_POST['json'], true );

$personen_auto = $data['personen_auto'];
$kampeer_auto  = $data['kampeer_auto'];

答案 2 :(得分:1)

代码每次调用只发送一个vehicleType到php。相关代码是

for (var vehicleType in roadTaxData.provinceWeightFuelPricesData) {
    data = ...
    passToPHP(vehicleType, JSON.stringify(data));
}

第一个电话通过&#39; personen_auto&#39;只有(并且kampeer_auto未定义);第二个电话只通过&#39; kampeer_auto&#39;和personen_auto未定义。

在循环外移动passToPHP的代码的修订版仍然会在每次循环时重置数据,因此在底部数据将仅包含最后一个自动省份。

要传递所有汽车,需要将数据附加到(未重新初始化),必须将数据收集到自动特定部分(不混合),并且passToPHP需要构建一个多参数查询字符串,每个汽车。所有这些都将重建roadTaxData对象。

或者只是将所有roadTaxData.provinceWeightFuelPricesData传递给php并使用php循环并分离自动类型。

<小时/>

编辑:在将对象传递给php时,您不需要将对象转换为数组。当可选的第二个参数设置为true时,Php的json_decode()可以将对象解码为关联数组,如json_decode($data, true)。简单地

passToPHP('json', JSON.stringify(roadTaxData.provinceWeightFuelPricesData));

并在php中

$data = json_decode($_POST['json'], true);
$kampeer_auto = $data['kampeer_auto']);
$personen_auto = $data['personen_auto']);