zoukankan      html  css  js  c++  java
  • PHP使用http_build_query()构造URL字符串的方法

    http_build_query

    http_build_query -- 生成 url-encoded 之后的请求字符串描述string http_build_query ( array formdata [, string numeric_prefix] )

    使用给出的关联(或下标)数组生成一个 url-encoded 请求字符串。参数 formdata 可以是数组或包含属性的对象。一个 formdata 数组可以是简单的一维结构,也可以是由数组组成的数组(其依次可以包含其它数组)。如果在基础数组中使用了数字下标同时给出了 numeric_prefix 参数,此参数值将会作为基础数组中的数字下标元素的前缀。这是为了让 PHP 或其它 CGI 程序在稍后对数据进行解码时获取合法的变量名。

    还是看一些简单的例子吧:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $data = array(
        'foo'=>'bar',
        'baz'=>'boom',
        'site'=>'www.nowamagic.net',
        'name'=>'nowa magic');
    echo http_build_query($data);
    /* output
     foo=bar&baz=boom&cow=milk&php=hypertext+processor
    */

    如果是索引数组与关联数组混合而成的数组又如何呢?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $data = array(
        'foo',
        'bar',
        'site'=>'www.nowamagic.net',
        'name'=>'nowa magic');
    echo http_build_query($data);
    /* output
        0=foo&1=bar&site=www.nowamagic.net&name=nowa+magic
    */

    它会自动添加数字索引。

    http_build_query 还有一个参数,可以给数字索引加前缀,我们再试试:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $data = array(
        'foo',
        'bar',
        'site'=>'www.nowamagic.net',
        'name'=>'nowa magic');
    echo http_build_query($data, "nm_");
    /* output
    nm_0=foo&nm_1=bar&site=www.nowamagic.net&name=nowa+magic
    */

    再复杂一些的数组又如何呢?比如二维数组什么的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $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');

    它的输出结果则是:

    1
    2
    3
    4
    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&0=CEO

    为了可读性对其进行了折行:

    1
    2
    3
    4
    user[name]=Bob+Smith&user[age]=47&user[sex]=M&user[dob]=5%1F12%1F1956&
    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

    注意:只有基础数组中的数字下标元素“CEO”才获取了前缀,其它数字下标元素(如 pastimes 下的元素)则不需要为了合法的变量名而加上前缀。

    不只是数组,连对象也能转化为URL字符串:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class myClass {
      var $foo;
      var $baz;
      function myClass() {
      $this->foo = 'bar';
      $this->baz = 'boom';
      }
    }
    $data = new myClass();
    echo http_build_query($data);

    末尾,再提几个函数,很可能在你搜索 http_build_query 时需要了解的:

    1. parse_str:将一个url ?后面的参数转换成一个数组,array parse_str(url,arr)。

    2. parse_url:将一个完整的url解析成数组,array parse_url(string url)。

    3. http_build_query:再简要解释下,将一个数组转换成url ?后面的参数字符串,会自动进行urlencode处理,string http_build_query ( array formdata [, string numeric_prefix]),后面的给数组中没有指定键或者键为数字的加下标。

    http_build_query -- 生成 url-encoded 之后的请求字符串描述string http_build_query ( array formdata [, string numeric_prefix] )

    使用给出的关联(或下标)数组生成一个 url-encoded 请求字符串。参数 formdata 可以是数组或包含属性的对象。一个 formdata 数组可以是简单的一维结构,也可以是由数组组成的数组(其依次可以包含其它数组)。如果在基础数组中使用了数字下标同时给出了 numeric_prefix 参数,此参数值将会作为基础数组中的数字下标元素的前缀。这是为了让 PHP 或其它 CGI 程序在稍后对数据进行解码时获取合法的变量名。

    例子 1. 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 
    */ 
    ?>

    例子 2. http_build_query() 使用数字下标的元素

    <?php 
    $data = array('foo', 'bar', 'baz', 'boom', 'cow' => 'milk', 'php' =>'hypertext processor'); 
    echo http_build_query($data); 
    /* 输出: 
           0=foo&1=bar&2=baz&3=boom&cow=milk&php=hypertext+processor 
    */ 
    echo http_build_query($data, 'myvar_'); 
    /* 输出: 
           myvar_0=foo&myvar_1=bar&myvar_2=baz&myvar_3=boom&cow=milk&php=hypertext+processor 
    */ 
    ?>

    例子 3. 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_'); 
    /* 输出:(为了可读性对其进行了折行) 
           user[name]=Bob+Smith&user[age]=47&user[sex]=M&user[dob]=5%1F12%1F1956& 
           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 
        注意:只有基础数组中的数字下标元素“CEO”才获取了前缀,其它数字下标元素(如 
        pastimes 下的元素)则不需要为了合法的变量名而加上前缀。 
    */ 
    ?>

    例子 4. http_build_query() 使用对象

    <?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 
    */ 
    ?>

    http://php.net/manual/zh/function.http-build-query.php

    更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP运算与运算符用法总结》、《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《php操作office文档技巧总结(包括word,excel,access,ppt)》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

    希望本文所述对大家PHP程序设计有所帮助。

    如对本文有疑问,请提交到交流社区,广大热心网友会为你解答!! 点击进入社区

  • 相关阅读:
    【LeetCode OJ】Remove Element
    【LeetCode OJ】Remove Duplicates from Sorted Array
    【LeetCode OJ】Swap Nodes in Pairs
    【LeetCode OJ】Merge Two Sorted Lists
    【LeetCode OJ】Remove Nth Node From End of List
    【LeetCode OJ】Two Sum
    【LeetCode OJ】Majority Element
    最长公共子序列问题
    php fopen与file_get_contents的区别
    PHP 技巧集合
  • 原文地址:https://www.cnblogs.com/bluealine/p/7542191.html
Copyright © 2011-2022 走看看