Params with null value do not present in result string.
<?
$arr = array('test' => null, 'test2' => 1);
echo http_build_query($arr);
?>
will produce:
test2=1
http_build_query
(PHP 5)
http_build_query — Generar una cadena de consulta codificada estilo URL
Descripción
$query_data
[, string $numeric_prefix
[, string $arg_separator
[, int $enc_type = PHP_QUERY_RFC1738
]]] )Genera una cadena de consulta codificada estilo URL a partir del array asociativo (o indexado) dado.
Parámetros
-
query_data -
Puede ser un array u objeto que contenga propiedades.
Si
query_dataes un array, puede ser de una dimensión, o un array de arrays (que a su vez puede contener otros arrays).Si
query_dataes un objeto, sólo las propiedades que son públicas serán incorporadas en el resultado. -
numeric_prefix -
Si se usan índices numéricos en el array base y se provee este parámetro, éste será añadido al comienzo de los índices numéricos para aquellos elementos encontrados sólo en el array base.
Esto es para permitir que se opere con nombres de variables legales cuando los datos sean decodificados por PHP u otra aplicación CGI más adelante.
-
arg_separator -
arg_separator.output es usado para separar argumentos, a menos que este parámetro sea especificado, en cuyo caso éste será usado.
-
enc_type -
Por omisión,
PHP_QUERY_RFC1738.Si
enc_typeesPHP_QUERY_RFC1738, la codificación se realiza de acuerdo al » RFC 1738 y el tipo de medios application/x-www-form-urlencoded, lo que implica que los espacios son codificados con el signo más (+).Si
enc_typeesPHP_QUERY_RFC3986, la codificación se realiza de acuerdo al » RFC 3986, y los espacios serán codificados (%20) más.
Valores devueltos
Devuelve una cadena codificada en forma URL.
Historial de cambios
| Versión | Descripción |
|---|---|
| 5.4.0 |
Se agregó el parámetro enc_type.
|
| 5.1.3 | Los corchetes cuadrados son escapados. |
| 5.1.2 |
Se agregó el parámetro arg_separator.
|
Ejemplos
Ejemplo #1 Uso simple de http_build_query()
<?php
$data = array('foo'=>'bar',
'baz'=>'boom',
'cow'=>'milk',
'php'=>'hypertext processor');
echo http_build_query($data) . "\n";
echo http_build_query($data, '', '&');
?>
El resultado del ejemplo sería:
foo=bar&baz=boom&cow=milk&php=hypertext+processor foo=bar&baz=boom&cow=milk&php=hypertext+processor
Ejemplo #2 http_build_query() con elementos indexados numéricamente.
<?php
$data = array('foo', 'bar', 'baz', 'boom', 'cow' => 'milk', 'php' =>'hypertext processor');
echo http_build_query($data) . "\n";
echo http_build_query($data, 'myvar_');
?>
El resultado del ejemplo sería:
0=foo&1=bar&2=baz&3=boom&cow=milk&php=hypertext+processor myvar_0=foo&myvar_1=bar&myvar_2=baz&myvar_3=boom&cow=milk&php=hypertext+processor
Ejemplo #3 con arrays complejos http_build_query()
<?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_');
?>
esto generará la salida: (acotada por razones de legibilidad)
user%5Bname%5D=Bob+Smith&user%5Bage%5D=47&user%5Bsex%5D=M& user%5Bdob%5D=5%2F12%2F1956&pastimes%5B0%5D=golf&pastimes%5B1%5D=opera& pastimes%5B2%5D=poker&pastimes%5B3%5D=rap&children%5Bbobby%5D%5Bage%5D=12& children%5Bbobby%5D%5Bsex%5D=M&children%5Bsally%5D%5Bage%5D=8& children%5Bsally%5D%5Bsex%5D=F&flags_0=CEO
Nota:
Sólo el elemento "CEO" indexado numéricamente el array base recibió un prefijo. Los otros índices numéricos, encontrados bajo los pasatiempos, no requieren un prefijo tipo cadena para ser nombres legales de variables.
Ejemplo #4 Uso de http_build_query() con un objeto
<?php
class parentClass {
public $pub = 'publicParent';
protected $prot = 'protectedParent';
private $priv = 'privateParent';
public $pub_bar = Null;
protected $prot_bar = Null;
private $priv_bar = Null;
public function __construct(){
$this->pub_bar = new childClass();
$this->prot_bar = new childClass();
$this->priv_bar = new childClass();
}
}
class childClass {
public $pub = 'publicChild';
protected $prot = 'protectedChild';
private $priv = 'privateChild';
}
$parent = new parentClass();
echo http_build_query($parent);
?>
El resultado del ejemplo sería:
pub=publicParent&pub_bar%5Bpub%5D=publicChild
Ver también
- parse_str() - Interpreta el string en variables
- parse_url() - Analiza una URL y devolver sus componentes
- urlencode() - Codifica como URL una cadena
- array_walk() - Aplicar una función de usuario a cada miembro de un array
When using the http_build_query function to create a URL query from an array for use in something like curl_setopt($ch, CURLOPT_POSTFIELDS, $post_url), be careful about the url encoding.
In my case, I simply wanted to pass on the received $_POST data to a CURL's POST data, which requires it to be in the URL format. If something like a space [ ] goes into the http_build_query, it comes out as a +. If you're then sending this off for POST again, you won't get the expected result. This is good for GET but not POST.
Instead you can make your own simple function if you simply want to pass along the data:
<?php
$post_url = '';
foreach ($_POST AS $key=>$value)
$post_url .= $key.'='.$value.'&';
$post_url = rtrim($post_url, '&');
?>
You can then use this to pass along POST data in CURL.
<?php
$ch = curl_init($some_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_url);
curl_exec($ch);
?>
Note that at the final page that processes the POST data, you should be properly filtering/escaping it.
Is it worth noting that if query_data is an associative array and a value is itself an empty array, or an array of nothing but empty array (or arrays containing only empty arrays etc.), the corresponding key will not appear in the resulting query string?
E.g.
$post_data = array('name'=>'miller', 'address'=>array('address_lines'=>array()), 'age'=>23);
echo http_build_query($post_data);
will print
name=miller&age=23
As noted before, with php5.3 the separator is & on some servers it seems. Normally if posting to another php5.3 machine this will not be a problem.
But if you post to a tomcat java server or something else the & might not be handled properly.
To overcome this specify:
http_build_query($array, '', '&');
and NOT
http_build_query($array); //gives & to some servers
I noticed that even with the magic quotes disabled, http_build_query() automagically adds slashes to strings.
So, I had to add "stripslashes" to every string variable.
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);}
?>
on my install of PHP 5.3, http_build_query() seems to use & as the default separator. Kind of interesting when combined with stream_context_create() for a POST request, and getting $_POST['amp;fieldName'] on the receiving end.
Correct implementation of coding the array of params without indexes (valdikks fixed code - didnt work for inner arrays):
<code>
function cr_post($a,$b='',$c=0)
{
if (!is_array($a)) return false;
foreach ((array)$a as $k=>$v)
{
if ($c)
{
if( is_numeric($k) )
$k=$b."[]";
else
$k=$b."[$k]";
}
else
{ if (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);
}
</code>
This function makes like this
files[0]=1&files[1]=2&...
To do it like this:
files[]=1&files[]=2&...
Do this:
$query = http_build_query($query);
$query = preg_replace('/%5B[0-9]+%5D/simU', '%5B%5D', $query);
If you need only key+value pairs, you can use this:
<?php
$array = array(
"type" => "welcome",
"message" => "Hello World!"
);
echo urldecode(http_build_query($array, '', ';'));
?>
Result: type=welcome;message=Hello World!
