用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.php 第 6 行
然后是personen_auto对象的数据日志。
然后这条消息的另一个错误,它没有重新调整 personen_auto
索引,我也刚刚解析并打印出来?
通知:未定义索引:personen_auto in C:\Users\Bas\Documents..\Cars\install.php 行 5
问题
它为什么不重新协调那些$_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的主要内容,如果未能解决你的问题,请参考以下文章