1

This is a similar question to this one: Convert js Array() to JSon object for use with JQuery .ajax

Except that I have an object that has several arrays in it.

Object looks like (simulated):

{"Users":[1,2,3,4], "Clients":[5,6,7,8], "CompletionStatus":"pastdue", "DateRange":"thisweek"}

and is created like so:

            Filter = new FilterData;

            Filter.Add(9, "Clients");
            Filter.Add(12, "Clients");
            Filter.Add(75, "Clients");

            Filter.Add(9, "Users");
            Filter.Add(12, "Users");
            Filter.Add(75, "Users");

            Filter.SetValue("DateRange", "yesterday");

    function FilterData(){

        this.Users = [];

        this.Clients = [];

        this.Options = [];
        this.Options.CompletionStatus = [];
        this.Options.DateRange = [];

        this.Add = function(id, type){
            this[type].push(id);
            this[type] = this[type].unique();
            return;
        }

        this.Rem = function(id, type){+
            this[type].splice( Filter[type].indexOf(id), 1);
            this[type] = this[type].unique();
            return;
        }

        this.SetValue = function(key, value){
            this.Options[key] = value;
        }

    }

...

If I just do:

AjaxRequest = $.ajax({
...
data: Filter,
...
});

it seems that obj will end up like: ...Users=1&Users=2&Users=3&....

This is causes PHP to only see one value for Users, which will be the last one, in this case 3.

where what I need for PHP to see the arrays properly is: ..Users[]=1&Users[]=2&Users[]=3&....

Any idea how to correct this?

Example:

In firebug, my post looks like this:

Clients 1
Clients 10
CompletionStatus    pastdue
DateRange   14
Users   2
Users   3
Users   4

and my response looks like this:
page: <?php print_r($_POST) ?>

Array
(
    [Users] => 4
    [Clients] => 10
    [CompletionStatus] => pastdue
    [DateRange] => 14
)
Community
  • 1
  • 1
Eli
  • 97,462
  • 20
  • 76
  • 81

2 Answers2

2

Change the name of Users to Users[] in the javascript. 'Users[]' is a valid property name for a javascript object:

var o= { 'Users[]': 'hello user' }; 
alert(o['Users[]']);
leepowers
  • 37,828
  • 23
  • 98
  • 129
2

Would it be possible for you to just use the built-in param method?

http://docs.jquery.com/Internals/jQuery.param

That seems to do what you want. It also has a few more cool additions in the jQuery 1.4alpha if you want the bleeding edge version.

Alex Sexton
  • 10,401
  • 2
  • 29
  • 41
  • Great minds think alike, but for some reason, param() does the same thing. One value only. – Eli Dec 11 '09 at 21:11
  • Should work now with jQuery >= 1.4. "As of jQuery 1.4, the $.param() method serializes deep objects recursively to accommodate modern scripting languages and frameworks such as PHP and Ruby on Rails." - http://api.jquery.com/jQuery.param/ – Jordan Brough Jan 29 '10 at 05:33
  • Yep! It wasn't out quite yet, but now 1.4.2 probably isn't far off - no changes on the param front in that one though. Check out the jQuery BBQ plugin for the "deparam" method that can accompany the native param method. – Alex Sexton Jan 29 '10 at 09:08