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

Array I am trying to pass:

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

Ajax call:

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);
                        }

Problem is that the php script only receives $_POST['request'], params is non-existent.

If I view params array in the console log before the ajax call I see this:

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

It seems like the problem could be that "param" parameter is not passed because it is seen as empty (it is not, at least before it is passed to ajax call), but why this is happening I have no idea. What am I missing here?

You have declared params as an array [] but assigned object properties to it using the ["string"] notation. This resulted in empty arrays with additional properties appended to the Array object.

Instead, it should have been declared as an object literal, with another object literal nested inside.

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

The structure of the $_POST should be something like:

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

)

You could send the data as JSON and decode it in php using json_decode():

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

})

Then in php receive it with:

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

Include json2.js library for older browsers that don't support JSON methods

EDIT: after a little testing will definitely need to change params to object and params.param to object, Changing [] to {} will accomplish this:

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

DEMO: http://jsfiddle.net/germk/2/