tags:

views:

223

answers:

2

Hi All,

This is a similar question to this one: http://stackoverflow.com/questions/713884/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
)
+2  A: 

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[]']);
pygorex1
+2  A: 

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
Great minds think alike, but for some reason, param() does the same thing. One value only.
Eli
I get different results, check this out: http://jsbin.com/uvige
Alex Sexton
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
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