在Jquery中我正在创建两个数组,一个嵌入另一个,就像这样......
arrayOne = [{name:'a',value:1}, {name:'b',value:2}]
var arrayTwo = [{name:'foo',value:'blah'},{name:'arrayOne',value:arrayOne}];
然后我把它放在Ajax中并通过PHP在另一侧提取变量。 print_r($ arrayTwo)的结果如下......
Array([foo] => blah [arrayOne] => [object Object],[object Object])
我看不出提取arrayOne内容的方法,这很可惜因为我真的需要它们!任何人都可以告诉我在Jquery中我做错了什么,或者我需要在PHP中做些什么来使嵌入式阵列可以访问。
非常感谢
编辑以添加我的Ajax代码....
$.ajax({
type: "POST",
url:'actions.php',
data:arrayTwo,
datatype:'json',
cache: false,
success: function(data){
}
})
答案 0 :(得分:3)
问题是jQuery的$.ajax
(或更确切地说$.param
)方法以特殊方式处理对象数组。 jQuery将使用name
作为参数名称,将 string 表示为value
作为值:
> $.param([{name: 'foo', value: 42}, {name: 'bar', value: 21}])
"foo=42&bar=21"
但是arrayOne
的字符串表示是你在服务器上看到的无用的东西:
> [{name:'a',value:1}, {name:'b',value:2}].toString()
"[object Object],[object Object]"
documentation实际上指出了传递数组/对象时的注意事项:
如果传递的对象位于Array中,则它必须是
返回的格式的对象数组.serializeArray()
[ { name: "first", value: "Rick" }, { name: "last", value: "Astley" }, { name: "job", value: "Rock Star" } ]
注意:由于某些框架解析序列化数组的能力有限,因此开发人员在传递包含嵌套在另一个数组中的对象或数组的
obj
参数时应谨慎。注意:由于param字符串没有普遍认可的规范,因此无法使用此方法对所有支持此类输入的语言进行理想编码的方式对复杂数据结构进行编码。使用JSON格式代替编码复杂数据。
由于您拥有复杂的数据结构,因此您应该使用JSON对数据进行编码:
data: {data: JSON.stringify(arrayTwo)},
然后在服务器上用
解码它$data = json_decode($_POST['data'], true);
$data
将具有与arrayTwo
完全相同的结构。
但是如果你想要实际拥有名称为foo
和arrayOne
的参数,那么你只需要序列化arrayOne
的值:
data: [
{name:'foo',value:'blah'},
{name:'arrayOne',value: JSON.stringify(arrayOne)}
],
并在PHP中:
$arrayOne = json_decode($_POST['arrayOne'], true);