通过ajax将多维数组传输到PHP

6

我在这里遇到了很大的困难。我正在尝试通过ajax将一个多维数组发送到PHP,但出现了一些问题。以下是我一直在尝试的内容:

为了简化,而不是复制并粘贴一堵代码墙:

    peoplearray[0]  =  [name] => 'john'
                       [age]  => '28'
                       [sex]  => 'Male'
    peoplearray[1]  =  [name] => 'julie'
                       [age]  => '20'
                       [sex]  => 'Female'

    main_array['item'] = 'x';
    main_array['something'] = 'x';
    main_array['another'] = 'x';

我希望通过 post 的方式将这个内容传递给 PHP。由于我处在多维数组中,因此我想将它们连接起来:

    main_array['peoplearray'] = peoplearray;

现在开始进行Ajax操作:
// var data = JSON.stringify(main_array);

var send = $.ajax({
        type: "POST",
        cache: false,
        url: "theurl",
        data: {data:main_array} //I do change this `main_array` when using the above stringify!
});


send.done(function(msg) {
console.log(msg);
})

目前在PHP中,我只是做了以下操作:

$data= $_POST['data'];
print_r($data);

在firebug中:(一个空字符串)

当我取消注释var data = JSON.stringify(main_array);时,我得到以下结果:[][

如果我在php中添加$data = json_decode($_POST['data']);,我会得到:

Array ( )

基本上,我意识到main_array不需要是一个数组,所以我可以轻松传递那些东西,但我需要做的是将peoplearray传递过来,这样我就可以在php中使用一些foreach等方法了。非常感谢任何帮助,我相信我只是太傻了!编辑:之所以这样做是因为peoplearray可能有0或100个条目,所以我只需要将它传递给php,这样我就可以使用foreach将其用于数据库输入。如果有更好的方法,我会非常感激听到它,因为我仍然是新手。编辑:由于Nicola的答案,一切都很顺利,除了最重要的部分——mainarry.peoplearray——它没有出现在返回的console.log中,我无法在PHP中访问它。有关此事的解决方案还是我必须将foreach智能放在javascript中并单独发送所有内容?

1
你能发布完整的JS函数,以便进行ajax请求吗?如果在调用$.ajax之前使用console.log(main_array),在Firebug中会显示什么? - Mircea Soaica
当在JSON.stringify之前执行console.log(main_array)时,我得到了正确的结果。在JSON.stringify之后,我得到了:[]。至于ajax,那是我目前正在做的全部。实际上,这是唯一真正的复制和粘贴!为了达到这个点,我花费了很长时间在Chrome中调试数组是不可行的,我刚刚发现了这一点。 - Zac
2个回答

7

首先,main_array 不是一个数组,而是一个对象,因为在 JavaScript 中没有关联数组,所以出现了这种情况。

main_array['peoplearray'] = peoplearray;

等同于

main_array.peoplearray = peoplearray;

你需要这样声明main_array。
var main_array = {};

然后尝试像这样更改您的函数:
var send = $.ajax({
        type: "POST",
        dataType: "json",
        cache: false,
        url: "theurl",
        data: {data:main_array} 
});

以及服务器端

header('Content-type: application/json');
$data= $_POST['data'];
echo json_encode($data);

首先,感谢您的回答。我意识到我对需要填充的对象/数组有一个基本的理解缺失。这个方法很好,但是返回的对象中我丢失了peoplearray,尽管它之前显示过。另外,在php端如何访问每个属性? - Zac

1

我通过将peoplearray分开来使其正常工作。

所以我按照尼古拉说的做法创建了一个对象mainarray,即用花括号声明:{}

peoplearray我保留为数组,即用[]声明,但是我将name,age&sex字段创建为对象,即{},然后将它们.push()peoplearray中。

然后ajax如下:

var send = $.ajax({
        type: "POST",
        dataType: "json",
        cache: false,
        url: "theurl",
        data: {data:main_array, people:peoplearray} 
});

然后使用PHP,所有内容都可以在$_POST中获得,如果您需要

echo json_encode($people); //or whatever var name it is stored as in the php 

对象即姓名,年龄,性别属性显示在中。

send.done(function(msg) {
console.log(msg);
})

这应该也可以通过将它们放在一起来解决,但这是一个好的解决方案。 - Nicola Peluchetti
是的,出于某种原因,当我在对象内部有一个数组或者一个数组内部有一个数组时,post和return都显示为空,这就是为什么我不得不将它们拆分,并确保每个“person”都是peoplearray内的一个对象。非常感谢你的帮助,Nicola。 - Zac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接