无法使用 ajax 将多维数组传递给 php

Posted

技术标签:

【中文标题】无法使用 ajax 将多维数组传递给 php【英文标题】:Can't pass multidimentional array to php with ajax 【发布时间】:2012-12-03 23:38:13 【问题描述】:

我试图传递的数组:

var params = [];
params['request'] = "movies";
params['param'] = [];
params['param']['sortBy'] = "title";
params['param']['sortOrder'] = "asc";

Ajax 调用:

return $.ajax(
        type: "POST",
        url: "http://192.168.0.100:83/getData.php",
        cache:false,
        data: params,
        dataType:"json",
        success: function(data)
            if(data != null)
                            console.log(data);
                        

问题是php脚本只接收$_POST['request'],params不存在。

如果我在 ajax 调用之前在控制台日志中查看 params 数组,我会看到:

[request: "movies", param: Array[0]]
length: 0
param: Array[0]
length: 0
sortBy: "title"
sortOrder: "asc"
__proto__: Array[0]
request: "movies"
__proto__: Array[0]

似乎问题可能是“param”参数没有被传递,因为它被视为空(它不是,至少在它被传递给 ajax 调用之前),但为什么会发生这种情况我不知道。我在这里错过了什么?

【问题讨论】:

尝试发送一个 json 对象而不是一个数组 @kennypu 会尽快尝试 @Toby Allen 你到底是什么意思? @Toby 他没有在上面的任何地方混合 js 和 PHP。 你的params实际上是一个对象,而不是一个数组[]javascript数组不像PHP数组)。像这样声明它。 var params = ;params['param'] 相同。 【参考方案1】:

您已将params 声明为数组[],但使用["string"] 表示法为其分配了对象属性。这导致空数组带有附加到 Array 对象的附加属性。

相反,它应该被声明为一个对象字面量,其中嵌套了另一个对象字面量。

var params = 
  request: "movies",
  param: 
    sortBy: "title",
    sortOrder: "asc"
  
;

$_POST 的结构应该是这样的:

Array
(
    [request] => movies
    [param] => Array
        (
            [sortBy] => title
            [sortOrder] => asc
        )

)

【讨论】:

我最初的问题是我创建了一个带有点符号的对象并将其用于我的“param”属性。如何使用 表示法添加/附加到对象? @DominicM 同样的方式——通过点符号。 params.param.newThing = "newvalue" 或通过[] params["param"]["newThing"] = "newValue",但通常在作为表达式或变量params["par" + "am"].newThing = "newValue"的结果动态生成属性字符串时使用。 我的方法是:var filters = []; filters.sortBy = "标题";然后:params = request: "movies", param: filters;但这不起作用,你知道为什么吗? @DominicM 因为filters,本质上具有sortBy 之类的字符串属性在您的代码中表现为对象 而不是数组[]。您需要声明为var filters = ; filters.sortBy = "title";【参考方案2】:

您可以将数据以 JSON 格式发送并使用 json_decode() 在 php 中对其进行解码:

$.ajax(        
        data:  paramData: JSON.stringify( params),
       /* other ajax options*/

)

然后在 php 中接收它:

$params= json_decode($_POST['paramData']); 
echo $params['request']; /* should return "movies" as response*/

为不支持 JSON 方法的旧浏览器包含 json2.js 库

编辑:经过一些测试后,肯定需要将 params 更改为 object 并将 params.param 更改为 object,将 [] 更改为 将完成此操作:

 var params = ;
 params['request'] = "movies";
 params['param'] = ;
 params['param']['sortBy'] = "title";
 params['param']['sortOrder'] = "asc";

演示:http://jsfiddle.net/germk/2/

【讨论】:

以上是关于无法使用 ajax 将多维数组传递给 php的主要内容,如果未能解决你的问题,请参考以下文章

使用php从多维数组中获取子数组

PHP:如何修改动态多维数组

如何使用 laravel 将多维数组传递给 API

Ajax以JSON访问从PHP返回的多维数组

将多维数组传递给函数 C

如何将多维动态数组传递给C++中的函数