Proposed Function: urlencode_array

php.internals

Sara Golemon

23 years ago
proto urlencode_array(array formdata [, string numeric_prefix]) Purpose: Generate a form encoded query string from an associative (or indexed) array. Example: $formdata = array('page'=>'home', 'users'=>array('bob'=>array('fname'=>'Bob','lname'=>'Smith'), 'jdoe'=>array('fname'=>'Jane','lname'=>'Doe')), 'errors'=>array('missing date','missing time','sums not =='), 'other data'); echo urlencode_array($formdata); /* outputs the following page=home&users[bob][fname]=Bob&users[bob][lname]=Smith&users[jdoe][fname]=J ane&users[jdoe][lname]=Doe&errors[0]=missing+date&errors[1]=missing+time&err ors[2]=sums+not+%3D%3D&0=other+data */ Example 2: Same array as above but encoded using a prefix for numeric values: echo urlencode_array($formdata, 'misc_'); page=home&users[bob][fname]=Bob&users[bob][lname]=Smith&users[jdoe][fname]=J ane&users[jdoe][lname]=Doe&errors[0]=missing+date&errors[1]=missing+time&err ors[2]=sums+not+%3D%3D&misc_0=other+data Note Example 2 allows numerically indexed arrays to generate query strings which will yield legal variable names, but doesn't enforce such behavior. Also, the numeric_prefix only applies to the root array's indexes since subsequence arrays may be indexed without compromise. The patch is available at: http://frankenbox.alphaweb.net/test/urlencode_array.diff.txt The underlying function php_url_encode_hash() is meant for later use in http_request() and for handling a context option in the http:// wrapper, but it seems as though there's no harm exporting it to userland. (Hence the addition of urlencode_array() -- I'm flexible on the name, array_urlencode() has been suggested as well) I'm looking for a couple +1s before I actually commit this though. -Sara

Ilia A.

23 years ago
I all my time coding PHP I have yet to encounter where such a function would be useful. It most cases, it would be simpler to generate the final data rather then 2 source arrays, which then will be used to generate the final query string. The one possible issue that I see is people using urlencode_array($_GET) and forgetting about things like magic_quotes_gpc resulting in data corruption etc... Many people also do quite a bit of input validation and usually re-use the same code to build the query string for subsequent pages. -0.5 Ilia On August 28, 2003 05:16 pm, Sara Golemon wrote:

Curt Zirzow

23 years ago
* Thus wrote Sara Golemon (pollita@php.net):
> proto urlencode_array(array formdata [, string numeric_prefix]) > > Purpose: Generate a form encoded query string from an associative (or > indexed) array.
Can this not be done easily with array_walk? I think this might also encourge people to use extremly long query strings, which will break when it gets to a certain length. I believe, off hand, 255 bytes is what is suggested max length for a query string. Curt
-- "I used to think I was indecisive, but now I'm not so sure."

Sara Golemon

23 years ago
> Can this not be done easily with array_walk? >
Yes, though the primary purpose here is to have a method to create a form-encoded query string internally, exporting it to userspace is just a "why the heck not" side-effect.
> I think this might also encourge people to use extremly long query > strings, which will break when it gets to a certain length. I > believe, off hand, 255 bytes is what is suggested max length for a > query string. >
For HTTP/1.0 GET query_strings yes (2048 bytes for HTTP/1.1 GET), but for POST data (which uses the same form encoding) the length of the query string is not limited. Note: I don't have a great deal invested in this, if there's no desire to use this my heart won't be broken. -Sara

Curt Zirzow

23 years ago
* Thus wrote Sara Golemon (pollita@php.net):
> > Can this not be done easily with array_walk? > > > Yes, though the primary purpose here is to have a method to create a > form-encoded query string internally, exporting it to userspace is just a > "why the heck not" side-effect.
Ahh.. ok.
> > > I think this might also encourge people to use extremly long query > > strings, which will break when it gets to a certain length. I > > believe, off hand, 255 bytes is what is suggested max length for a > > query string. > > > For HTTP/1.0 GET query_strings yes (2048 bytes for HTTP/1.1 GET), but for > POST data (which uses the same form encoding) the length of the query string > is not limited.
I did have a feeling 255 was a bit small, thanks for clarifying that for me.
> > Note: I don't have a great deal invested in this, if there's no desire to > use this my heart won't be broken.
My second thought was to perhaps apply this to urlencode so urlencode would be defined as: string urlencode(mixed expression) Although this sort undefines what exacly urlencode does and might lead to even more confusion. Curt
-- "I used to think I was indecisive, but now I'm not so sure."

Moriyoshi Koizumi

22 years ago
I find this useful, but the name is a bit confusing because the function works differently than a combo of urlencode() / rawurlencode() and array_map(). One of my picks is build_query_string() (this doesn't conform to the naming convention though.) Moriyoshi "Sara Golemon" <pollita@php.net> wrote:

Sara Golemon

22 years ago
Since Wez has been talking about an http_request() function (which inspired the underlying php_url_encode_hash() function), using a name like http_query_string() (or similar) might suffice for both naming conventions and suitability. -Sara

Wez Furlong

22 years ago
http_build_query() sounds about right to me. --Wez. "Sara Golemon" <pollita@php.net> wrote in message news:20030902212305.8873.qmail@pb1.pair.com...
> Since Wez has been talking about an http_request() function (which
inspired
> the underlying php_url_encode_hash() function), using a name like > http_query_string() (or similar) might suffice for both naming conventions > and suitability. > > -Sara > > > I find this useful, but the name is a bit confusing because the function > > works differently than a combo of urlencode() / rawurlencode() and > > array_map(). One of my picks is build_query_string() (this doesn't
conform