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 — URL kodlamalı sorgu dizgesi üretir
Açıklama
$form_verisi
[, string $sayısal_önek
[, string $ayraç
]] )Belirtilen ilişkisel (veya indisli) diziden bir URL kodlamalı dizge üretir.
Değiştirgeler
-
form_verisi -
Özellikleri içeren bir dizi veya nesne belirtilebilir.
Belirtilen dizi tek boyutlu bir dizi olabileceği gibi çok boyutlu iç içe diziler içeren bir dizi de olabilir.
-
sayısal_önek -
Temel dizide sayısal indisler kullanılmışsa sayısal indislerin her birinin önüne bu değiştirgede belirtilen değer getirilir ve bu sadece temel dizinin indislerine uygulanır.
Bunun böyle yapılmasının sebebi, verinin daha sonra PHP veya başka bir CGI uygulaması tarafından URL kodlaması çözüldüğünde elde geçerli (meşru) değişken isimleri kalmasını sağlamaktır.
-
ayraç -
Bu değiştirgede bir ayraç belirtilmezse değiştirge ayracı olarak arg_separator.output yönergesinde belirtilen ayraç kullanılır.
Dönen Değerler
URL kodlamalı bir dizge döner.
Sürüm Bilgisi
| Sürüm: | Açıklama |
|---|---|
| 5.1.2 |
ayraç değiştirgesi eklendi.
|
| 5.1.3 | Köşeli ayraçlar öncelendi. |
Örnekler
Örnek 1 - http_build_query() basit kullanımı
<?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, '', '&');
// foo=bar&baz=boom&cow=milk&php=hypertext+processor
?>
Örnek 2 - Sayısal indisli elemanlarla 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, 'myvar_');
?>
Yukarıdaki örneğin çıktısı:
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
Örnek 3 - http_build_query() ve çok boyutlu diziler
<?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_');
?>
Örneğin çıktısı: (okunabilirlik için satır katlanmıştır)
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
Bilginize:
Sadece, temel dizi içindeki sayısal indisli "CEO" elemanı bir önek alır. Alt dizilerdeki diğer sayısal indislerin meşru değişken ismi olabilmesi için bir dizge ile öncelenmeleri gerekmez.
Örnek 4 - http_build_query() ve bir nesne
<?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
?>
Ayrıca Bakınız
- parse_str() - Dizge içindeki değişkenleri çözümler
- parse_url() - Bir URL'yi bileşenlerine ayırır
- urlencode() - Dizgeye URL kodlaması uygular
- array_walk() - Bir dizinin her üyesine kullanıcı tanımlı bir işlevi uygular
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.
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.
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);}
?>
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!
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);
