|
|
http_build_query (PHP 5) http_build_query -- Generate URL-encoded query string Descriptionstring http_build_query ( array formdata [, string numeric_prefix [, string arg_separator]] )
Generates a URL-encoded query string from the associative (or indexed) array provided.
formdata may be an array or object containing properties.
A formdata array may be a simple one-dimensional structure,
or an array of arrays (who in turn may contain other arrays). If numeric indices
are used in the base array and a numeric_prefix is provided,
it will be prepended to the numeric index for elements in the base array only.
This is to allow for legal variable names when the data is decoded by PHP
or another CGI application later on.
Замечание:
arg_separator.output is
used to separate arguments, unless the
arg_separator parameter is specified, which is then
used.
Пример 1. Simple usage of http_build_query() |
<?php
$data = array('foo'=>'bar',
'baz'=>'boom',
'cow'=>'milk',
'php'=>'hypertext processor');
echo http_build_query($data); echo http_build_query($data, '', '&'); ?>
|
|
Пример 2. http_build_query() with numerically index elements. |
<?php
$data = array('foo', 'bar', 'baz', 'boom', 'cow' => 'milk', 'php' =>'hypertext processor');
echo http_build_query($data);
echo http_build_query($data, 'myvar_');
?>
|
|
Пример 3. http_build_query() with complex arrays |
<?php
$data = array('user'=>array('name'=>'Bob Smith',
'age'=>47,
'sex'=>'M',
'dob'=>'5/12/1956'),
'pastimes'=>array('golf', 'opera', 'poker', 'rap'),
'children'=>array('bobby'=>array('age'=>12,
'sex'=>'M'),
'sally'=>array('age'=>8,
'sex'=>'F')),
'CEO');
echo http_build_query($data, 'flags_');
?>
|
this will output : (word wrapped for readability)
user[name]=Bob+Smith&user[age]=47&user[sex]=M&user[dob]=5%2F12%2F1956&
pastimes[0]=golf&pastimes[1]=opera&pastimes[2]=poker&pastimes[3]=rap&
children[bobby][age]=12&children[bobby][sex]=M&children[sally][age]=8&
children[sally][sex]=F&flags_0=CEO |
Замечание:
Only the numerically indexed element in the base array "CEO" received a
prefix. The other numeric indices, found under pastimes, do not
require a string prefix to be legal variable names.
|
Пример 4. Using http_build_query() with an object |
<?php
class myClass {
var $foo;
var $baz;
function myClass() {
$this->foo = 'bar';
$this->baz = 'boom';
}
}
$data = new myClass();
echo http_build_query($data); ?>
|
|
Замечание:
The arg_separator parameter was added in PHP 5.1.2.
See also:
parse_str(),
parse_url(),
urlencode(), and
array_walk()
add a note
User Contributed Notes
http_build_query
donovan jimenez
18-Oct-2007 11:37
Other languages (in my case Java) allow access to multiple values for the same GET/POST parameter without the use of the brace ([]) notation. I wanted to use this function because it was faster than my own PHP implementation that urlencoded each part of a parameter array, but I needed to be able to send something like this to a service:
...?q=foo&q=bar
obviously http_build_query() by itself would have given me:
...?q[0]=foo&q[1]=bar
So, preg_replace to the rescue:
...
$query_string = http_build_query($params);
$query_string = preg_replace('/%5B(?:[0-9]|[1-9][0-9]+)%5D=/', '=', $query_string);
...
And I get single dimension arrays encoded how I need them. This works because the '=' character can't appear non-urlencoded except for exactly where I expect it to appear (between key / value pairs).
DISCLAIMER: this workaround was only intended for getting rid of the array notation when a parameter had multiple "simple" values. More complex structures will probably be mangled.
fabrizio[AT]bibivu[DOT]com
08-Sep-2007 01:28
This is my own version that I was using for php <=4, hope that will help someone
this can accomplish a few things:
if called w/o parameters will return the current link
if called with the first parameter like:
param1=a¶m2=b
will return a link with the query string containing ONLY what is passed.
if called with the first parameter like:
¶m1=a¶m2=b
will return a string with the current query string plus what is passed to the function
this function uses by default PHP_SELF, but if you pass the page will create the link with what you pass.
If pass secure(boolean), will create an https or http.
$url will be the actual domain. This function will use a global variable if nothing is passed, but feel free to modify it to use the _SERVER variables.
$html is a boolean. If true will create links with & else just &
<?php
function create_link($query=NULL, $page=NULL, $secure=NULL, $html=NULL, $port=NULL, $url=NULL ){
if($html === NULL) $html = true;
if($url === NULL){
if($secure==true){
$url = $GLOBALS['_cfg']['secure_site'];
} else {
$url = $GLOBALS['_cfg']['url'];
}
}
if($query === NULL) $query = $_SERVER['QUERY_STRING'];
if($port === NULL && isset($_SERVER['BIBIVU-HTTPD'])){
$port === _SERVER_ADMIN_PORT;
}
if((isset($_SERVER['BIBIVU-HTTPD']) || !isset($_COOKIE[session_name()])) && $this->is_crawler()===false){
$query = $query.($query!=''?'&':'').session_name().'='.session_id();
}
if(substr($query,0,1) == '&'){
$query = $this->change_query(substr($query,1));
}
if($page === NULL) $page = $_SERVER['PHP_SELF'];
$page = str_replace('//','/',$page);
if(substr($page,0,1)=='/') $page = substr($page,1);
$newQry = array();
if($query!=''){
parse_str($query, $newQuery);
foreach($newQuery as $key => $item){
$newQry[] = $key.'='.$item;
}
}
if($html){
$query = implode('&', $newQry);
} else {
$query = implode('&', $newQry);
}
if(isset($_SERVER['BIBIVU-HTTPD'])){
$host = '';
} elseif(defined('_ADMIN_BIB') && _ADMIN_BIB==1){
if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on' && ($secure===NULL || $secure===true )){
$host = 'https://';
} else {
$host = 'http://';
}
if (strrpos($_SERVER['HTTP_HOST'], ':') > 0){
$host .= substr($_SERVER['HTTP_HOST'], 0, strrpos($_SERVER['HTTP_HOST'], ':'));
} else {
$host .= $_SERVER['HTTP_HOST'];
}
} else {
if($secure==true){
$host = 'https://'.$url;
} else {
$host = 'http://'.$url;
}
}
if($port==NULL){
$port = $_SERVER['SERVER_PORT'];
if($port<=0) $port = 80;
}
if($port!=80 && $port!=443){
$host .=':'.$port;
}
if($page===''){
$ret = $query;
} else {
$ret = $host.'/'.$page.($query!=''?'?'.$query:'');
}
return $ret;
}
function change_query($addto_query, $queryOld = NULL){
if ($queryOld === NULL){
$query1 = $_SERVER['QUERY_STRING'];
} else {
$query1 = $queryOld;
}
parse_str ($query1, $array1);
parse_str ($addto_query, $array2);
$newQuery = array_merge($array1, $array2);
foreach($newQuery as $key => $item){
$newQry[] = $key . '=' . $item;
}
return implode('&', $newQry);
}
?>
valdikss at gmail dot com
27-Aug-2007 01:15
This function is wrong for http!
arrays in http is like this:
files[]=1&files[]=2&...
but function makes like this
files[0]=1&files[1]=2&...
Here is normal function:
<?php
function cr_post($a,$b='\',$c=0){
if (!is_array($a)) return false;
foreach ((array)$a as $k=>$v){
if ($c) $k=$b.\"[]\"; elseif (is_int($k)) $k=$b.$k;
if (is_array($v)||is_object($v)) {$r[]=cr_post($v,$k,1);continue;}
$r[]=urlencode($k).\"=\".urlencode($v);}return implode(\"&\",$r);}
?>
pinkgothic at gmail dot com
27-Apr-2007 02:24
Be careful if you're assuming that arg_separator defaults to "&".
For me, with my xampp installation and PHP 5.2.1, this was scary:
[php.ini]
; The separator used in PHP generated URLs to separate arguments.
; Default is "&".
arg_separator.output = "&"
... as it gave me a complete headache debugging something, as I expected the string length to be the length of the string my browser was displaying. I was so certain arg_separator was "&" because I'd never changed my php.ini that it took me seemingly forever to consider looking at the source code.
D'oh.
This may seem irrelevant at first (and I realise my case is an unusual way of stumbling into this issue), but since, if you run htmlspecialchars() over "&", the result will be "&amp;", DON'T expect a one- or two-parameter http_build_query() to return a query you still have to run through htmlspecialchars().
I suggest using the third parameter to retain your sanity.
mqchen at gmail dot com
03-Feb-2007 01:27
To flyingmeteor,
Your function is pleasingly adequate, however, when comparing the results from your function with the results from the actual function, it has a minor defect. If one uses a special character (e.g.
|
|