Changeset [5448] (the "Ajax mega-patch" - #6366) changed the way Ajax handles parameters - it prefers a hash now because they are now internally handled like one. If given a query string it will break it down using toQueryParams(). When making the actual request it serializes the hash using toQueryString(). I then hastingly patched #4436 (commited in [5489]) so not to have problems with multiple values in forms.
My idea behind this was to encourage handling query params as hashes throughout the whole framework - my next ticket/patch will be about Form.serialize returning a hash (not a string) because the results are usually passed directly to an Ajax.Request anyway. But before that, something must be sorted out - parameters with multiple values (yeah, again).
Right now "foo=1&foo=2" becomes foo: [1,2] (and the other way around). Ruby CGI.parse does it the same way, but PHP is the problem - it doesn't make an array, but only takes the last value. Like slusarz states, PHP wants it like "foo[]=1&foo[]=2". I don't know about Python, Perl, Java, .NET and others, put PHP alone is wide enough adopted to consider this somewhat a serious issue.
The problem is: how to serialize foo:[1,2] - with or without the square brackets? Do we make this configurable with extra param to the function call? What will be the default then? Should "foo[]=1&foo[]=2" become foo:[1,2] also (instead of "foo[]":[1,2])? How about a global setting on the Form object that serialization methods will obey (removes the need for an extra param)?
Do we just leave things as they are? If I'm not mistaken (I'm not in a position to test where I am now), if a user names a form control "foo[]" all will be well.