【问题标题】:PHP function to build query string from arrayPHP函数从数组构建查询字符串
【发布时间】:2010-09-28 21:15:13
【问题描述】:

我正在寻找 PHP 函数的名称,以便从键值对数组构建查询字符串。请注意,我正在寻找 内置 PHP 函数来执行此操作,而不是自制函数(这似乎是谷歌搜索返回的所有内容)。有一个,我只是不记得它的名字或在 php.net 上找到它。 IIRC 它的名字不是那么直观。

【问题讨论】:

    标签: php


    【解决方案1】:

    您正在寻找http_build_query()

    【讨论】:

    • 这是一个相当新的函数,可从 PHP 5 开始使用。
    • 小心这个功能!它将省略任何值为 NULL 的键值对。 echo http_build_query(array("foo"=>"bar","bar"=>null)) 只会产生 foo=bar
    • @cb0 这类似于在浏览器中提交表单,提交的查询中不会包含空输入字段。
    • @ceejayoz 好吧,你早就知道了……你的愿望实现了吗?
    【解决方案2】:

    这是一个简单的 php4 友好的实现:

    /**
    * Builds an http query string.
    * @param array $query  // of key value pairs to be used in the query
    * @return string       // http query string.
    **/
    function build_http_query( $query ){
    
        $query_array = array();
    
        foreach( $query as $key => $key_value ){
    
            $query_array[] = urlencode( $key ) . '=' . urlencode( $key_value );
    
        }
    
        return implode( '&', $query_array );
    
    }
    

    【讨论】:

    • 在进行解码时,PHP 似乎也对密钥进行了百分比解码。可能值得在这里做吗?
    • @cloudfeet 这样做似乎是合理的。感谢您指出。
    【解决方案3】:

    就像对@thatjuan 的回答一样。
    更兼容的 PHP4 版本:

    if (!function_exists('http_build_query')) {
        if (!defined('PHP_QUERY_RFC1738')) {
            define('PHP_QUERY_RFC1738', 1);
        }
        if (!defined('PHP_QUERY_RFC3986')) {
            define('PHP_QUERY_RFC3986', 2);
        }
        function http_build_query($query_data, $numeric_prefix = '', $arg_separator = '&', $enc_type = PHP_QUERY_RFC1738)
        {
            $data = array();
            foreach ($query_data as $key => $value) {
                if (is_numeric($key)) {
                    $key = $numeric_prefix . $key;
                }
                if (is_scalar($value)) {
                    $k = $enc_type == PHP_QUERY_RFC3986 ? urlencode($key) : rawurlencode($key);
                    $v = $enc_type == PHP_QUERY_RFC3986 ? urlencode($value) : rawurlencode($value);
                    $data[] = "$k=$v";
                } else {
                    foreach ($value as $sub_k => $val) {
                        $k = "$key[$sub_k]";
                        $k = $enc_type == PHP_QUERY_RFC3986 ? urlencode($k) : rawurlencode($k);
                        $v = $enc_type == PHP_QUERY_RFC3986 ? urlencode($val) : rawurlencode($val);
                        $data[] = "$k=$v";
                    }
                }
            }
            return implode($arg_separator, $data);
        }
    }
    

    【讨论】:

      【解决方案4】:

      Implode 将为您将一个数组组合成一个字符串,但是要从一个键/值对中进行 SQL 查询,您必须编写自己的函数。

      【讨论】:

      • 试过了,但是不行。我正在尝试构建一个 http 查询字符串,它需要数组中的键和值,implode 不能这样做。
      • 我明白了,我不确定您是指 SQL 查询字符串还是 http 查询字符串。
      猜你喜欢
      • 1970-01-01
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      相关资源
      最近更新 更多