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

Posted

技术标签:

【中文标题】用JS解析JS数组,然后传给PHP【英文标题】:Parsing JS array with JS and then passing it to PHP 【发布时间】:2015-02-20 00:01:02 【问题描述】:

我正在创建一个用于计算荷兰道路税的系统,因为我有一些 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));

我首先得到了这个错误,它没有从$_POST 重新调整kampeer_auto 索引,我实际上发送了它:

通知:未定义索引:kampeer_auto in C:\Users\Bas\Documents..\Cars\install.php6 行

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

然后这条消息的另一个错误,它没有重新调整 personen_auto 索引,我也刚刚解析并打印出来?

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

问题

它为什么不重新协调那些$_POST 变量? 我怎样才能让 PHP 在当时只收到 1 个 $_POST 索引?

我自己的尝试

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

/*
 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));

但这仅将一个变量传递给 PHP(kampeer_auto)。

【问题讨论】:

【参考方案1】:

代码每次调用 php 时只发送一个车辆类型。相关代码是

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

第一个调用仅通过“personen_auto”(并且 kampeer_auto 未定义);第二次调用仅通过 'kampeer_auto' 并且 personen_auto 未定义。

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

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

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


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

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

在php中

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

【讨论】:

嗯,好的,谢谢,但我不喜欢每个vehicle_type 都存储在一个数组中的事实。我将如何向 PHP 发送更多数据? 我不确定我是否理解。是roadTaxData.provinceWeightFuelPricesData 的问题吗?将多个vehicleTypes传递给php与传递一个数组相同,但增加了双重编码的复杂性——查询参数本身是一个key-value hash(http查询编码),每个vehicleType的fueldPricesData也是一个key-value hash (json编码)。我有一个 nodejs 版本的 php http_build_query() 调用,它构建了一个与 php 兼容的分层查询字符串,但我不确定这就是你要找的(它在 npmjs.org/package/arlib 中)【参考方案2】:

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

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

【讨论】:

什么意思?一个工作正常(最后一个循环解析),但是当我尝试得到两个时它不起作用。【参考方案3】:

尝试将数据声明放在循环之外。目前正在为 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'];

【讨论】:

谢谢,但这不会向 PHP 发送多个数据。

以上是关于用JS解析JS数组,然后传给PHP的主要内容,如果未能解决你的问题,请参考以下文章

为啥js二维数组传给后台接收到的数据变成了字符串

js怎么解析后台传过来的二维数组

js 获取json数组里面数组的长度

javascript怎么遍历后台request传过来的List对象

js传递数组

前端向后端传一个json数组对象