使用jQuery Ajax传递带字母数字键的数组失败求助
问题分析与解决方案
为什么带字符串键的“数组”传不过去?
JavaScript的Array类型是专门为数字索引的有序集合设计的。当你用new Array()创建数组后,给它添加字符串键(比如ArrayAmounts["P1"])时,这些键值对其实是被当作数组对象的自定义属性,而非数组的元素。jQuery的$.ajax在序列化数据时,只会处理数组的数字索引元素,完全忽略这些额外属性,所以PHP那边自然接收不到。
而你用数字索引(ArrayAmounts[0])时,这是标准的数组元素,$.ajax会正确把它序列化为PHP能识别的数组格式,所以能正常传递。
解决方法:改用普通对象存储键值对
既然你需要用字母数字类型的键,直接用JavaScript的普通对象({})就可以了,对象本来就是用来存储任意键名的键值对的。修改后的代码如下:
修改后的JavaScript代码
// 用普通对象替代Array来存储带字符串键的键值对 var ArrayAmounts = {}; ArrayAmounts["P1"] = "16150"; // 也可以用更简洁的字面量写法: // var ArrayAmounts = { P1: "16150" }; $.ajax({ url: "myajax", cache: false, // *注意这里不要加引号,false是布尔值,加引号会变成字符串"false",起不到禁用缓存的作用* type: 'POST', data: { Arr: ArrayAmounts }, success: function(data){ console.log(data); }, error: function(xhr, AjaxOptions, ThrownError){ ShowMessage(xhr.responseText); } });
PHP接收代码
在PHP端,你可以直接通过$_POST获取这个对象(PHP会自动解析为关联数组):
// 接收传递过来的关联数组 $amounts = $_POST['Arr']; // 访问指定键的值 echo $amounts['P1']; // 输出 16150
额外提示
如果之后你需要传递同时包含数字索引和自定义键的集合,也建议用对象来统一存储,避免混淆Array和对象的用法。另外,cache: false不需要加单引号,布尔值直接写false即可,加引号会被当作字符串处理,达不到禁用缓存的效果。
内容的提问来源于stack exchange,提问作者Mandeep Singh
相关产品推荐
相关产品推荐

