http_build_query

(PHP 5, PHP 7, PHP 8)

http_build_query生成 URL-encode 之后的請求字符串

說明

http_build_query(
    mixed $query_data,
    string $numeric_prefix = ?,
    string $arg_separator = ?,
    int $enc_type = PHP_QUERY_RFC1738
): string

使用給出的關(guān)聯(lián)(或下標(biāo))數(shù)組生成一個經(jīng)過 URL-encode 的請求字符串。

參數(shù)

query_data

可以是數(shù)組或包含屬性的對象。

一個 query_data 數(shù)組可以是簡單的一維結(jié)構(gòu),也可以是由數(shù)組組成的數(shù)組(其依次可以包含其它數(shù)組)。

如果 query_data 是一個對象,只有 public 的屬性會加入結(jié)果。

numeric_prefix

如果在基礎(chǔ)數(shù)組中使用了數(shù)字下標(biāo)同時給出了該參數(shù),此參數(shù)值將會作為基礎(chǔ)數(shù)組中的數(shù)字下標(biāo)元素的前綴。

這是為了讓 PHP 或其它 CGI 程序在稍后對數(shù)據(jù)進(jìn)行解碼時獲取合法的變量名。

arg_separator

除非指定并使用了這個參數(shù),否則會用 arg_separator.output 來分隔參數(shù)。

enc_type

默認(rèn)使用 PHP_QUERY_RFC1738。

如果 enc_typePHP_QUERY_RFC1738,則編碼將會以 ? RFC 1738 標(biāo)準(zhǔn)和 application/x-www-form-urlencoded 媒體類型進(jìn)行編碼,空格會被編碼成加號(+)。

如果 enc_typePHP_QUERY_RFC3986,將根據(jù) ? RFC 3986 編碼,空格會被百分號編碼(%20)。

返回值

返回一個 URL 編碼后的字符串。

更新日志

版本 說明
5.4.0 加入了 enc_type 參數(shù)。
5.1.3 方括號也會被轉(zhuǎn)義。
5.1.2 加入了參數(shù) arg_separator

范例

示例 #1 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'''&amp;');

?>

以上例程會輸出:

foo=bar&baz=boom&cow=milk&php=hypertext+processor
foo=bar&amp;baz=boom&amp;cow=milk&amp;php=hypertext+processor

示例 #2 http_build_query() 使用數(shù)字下標(biāo)的元素

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

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

以上例程會輸出:

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

示例 #3 http_build_query() 使用復(fù)雜的數(shù)組

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

這會輸出:(為了可讀性,字已經(jīng)換行了)

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

注意:

只有基礎(chǔ)數(shù)組中的數(shù)字下標(biāo)元素“CEO”才獲取了前綴,其它數(shù)字下標(biāo)元素(如 pastimes 下的元素)則不需要為了合法的變量名而加上前綴。

示例 #4 http_build_query() 使用對象

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

以上例程會輸出:

pub=publicParent&pub_bar%5Bpub%5D=publicChild

參見

  • parse_str() - 將字符串解析成多個變量
  • parse_url() - 解析 URL,返回其組成部分
  • urlencode() - 編碼 URL 字符串
  • array_walk() - 使用用戶自定義函數(shù)對數(shù)組中的每個元素做回調(diào)處理