PHP 5.6.0beta1 released

http_build_query

(PHP 5)

http_build_queryGera a string de consulta (query) em formato URL

Descrição

string http_build_query ( array $formdata [, string $numeric_prefix [, string $arg_separator ]] )

Gera a string de consulta (query) em formato URL a partir de um array associativo (ou indexado).

Parâmetros

formdata

Pode ser uma array ou objeto contendo propriedades.

O array form pode ser uma estrutura simples, unidimensional, ou um array de arrays (que, por sua vez, pode contar outros array).

numeric_prefix

Se índices numéricos são usados no array base e esse parâmetro for fornecido, o número índice dos elementos será prefixado com seu valor, apenas no array base.

Isso é feito para permitir nomes de variáveis aceitáveis quando os dados forem decodificados pelo PHP ou por outra aplicação CGI posteriormente.

arg_separator

arg_separator.output é usado para separar argumentos, a não que esse parâmetro seja especificado. Nesse caso, o valor passado é usado como separador.

Valor Retornado

Retorna um string no formato de uma URL.

Changelog

Versão Descrição
5.1.2 O parâmetro arg_separator foi adicionao.
5.1.3 colchetes são escapados, ou seja, recebem um caracter de controle.

Exemplos

Exemplo #1 Exemplo de uso de http_build_query()

<?php
$data 
= array('foo'=>'bar',
              
'baz'=>'boom',
              
'cow'=>'milk',
              
'php'=>'hypertext processor');

echo 
http_build_query($data); // foo=bar&baz=boom&cow=milk&php=hypertext+processor
echo http_build_query($data'''&amp;'); // foo=bar&amp;baz=boom&amp;cow=milk&amp;php=hypertext+processor

?>

Exemplo #2 http_build_query() com elementos indexados numericamente.

<?php
$data 
= array('foo''bar''baz''boom''cow' => 'milk''php' =>'hypertext processor');

echo 
http_build_query($data) . "\n";
echo 
http_build_query($data'myvar_');
?>

O exemplo acima irá imprimir:

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

Exemplo #3 http_build_query() com arrays complexos

<?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_');
?>

isso resultará : (quebra de linhas para legibilidade)

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:

Apenas o elemento indexado numericamente no array base "CEO" recebeu um prefixo. Os outros índices numéricos, encontrados abaixo de "pastimes", não requerem uma string de prefixo para serem nomes de variáveis aceitáveis.

Exemplo #4 Usando http_build_query() com um objeto

<?php
class myClass {
    var 
$foo;
    var 
$baz;

    function 
myClass() {
        
$this->foo 'bar';
        
$this->baz 'boom';
    }
}

$data = new myClass();

echo 
http_build_query($data); // foo=bar&baz=boom

?>

Veja Também

add a note add a note

User Contributed Notes 12 notes

up
20
Ilya Rudenko
8 years ago
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
up
9
eric dot muyser at gmail dot com
1 year ago
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);
up
3
Vitaly Dyatlov
11 months ago
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>
up
3
netrox at aol dot com
4 years ago
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.
up
4
anonymous
1 year ago
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
up
4
Anonymous
3 years ago
As noted before, with php5.3 the separator is &amp; 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 &amp; might not be handled properly.

To overcome this specify:

http_build_query($array, '', '&');

and NOT

http_build_query($array); //gives &amp; to some servers
up
3
irish [-@-] ytdj [-dot-] ca
4 years ago
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.
up
2
v0idnull[try_to_spam_me_now] at gee-mail dot co
4 years ago
on my install of PHP 5.3, http_build_query() seems to use &amp; 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.
up
1
stocki dot r at gmail dot com
1 year ago
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!
up
1
valdikss at gmail dot com
6 years ago
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);}
?>
up
-1
Kirils Solovjovs
8 months ago
instead of some other suggestions that did not work for me, I found that the best way to build POST content (e.g. for stream_context_create) is urldecode(http_build_query($query))
up
-3
jakub dot lopuszanski at nasza-klasa dot pl
4 months ago
While this is not documented, this http_build_query can return FALSE on some inputs:
<?php
 
//gives bool(false)
 
var_dump(http_build_query('whatever'));
?>
To Top