PHP函数从数组构建查询字符串


165

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

Answers:


312

您正在寻找http_build_query()


这是一个相当新的功能,可以从PHP 5
Calmarius

15
小心此功能!它将忽略任何值为NULL的键-值对。echo http_build_query(array("foo"=>"bar","bar"=>null))将仅产生foo=bar
cb0

@ cb0的工作方式类似于浏览器中的表单提交,提交的查询中将不包含空的输入字段。
TJ L

1
@ceejayoz好了,您已经知道了很长时间……您的愿望实现了吗?
安德鲁

21

这是一个简单的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 );

}

30
这是一个php4版本。
0x6A75616E 2011年

1
在进行解码时,PHP似乎也可以对密钥进行百分比解码。在这里可能值得这样做吗?
cloudfeet

@cloudfeet这样做似乎是合理的。感谢您指出。
0x6A75616E 2013年

2

就像@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);
    }
}

-2

由于这个问题对于PHP来说已经很老了,因此这是在(当前)非常流行的PHP框架Laravel中解决此问题的一种方法。

要在您的应用程序中对路径的查询字符串进行编码,请提供您的路由名称,然后使用如下的route()辅助函数

route('documents.list.', ['foo' => 'bar']);

结果将类似于:

http://localhost/documents/list?foo=bar

另请注意,如果您的路线具有任何路径段参数,例如/documents/{id},请确保也将id参数传递给route()参数,否则它将默认使用第一个参数的值。


-3

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


试过了,但是行不通。我试图建立一个http查询字符串,它需要键和数组中的值,implode无法做到这一点。
罗宾·巴恩斯

2
我知道,不确定是要使用SQL查询字符串还是使用http查询字符串。
点击Upvote
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.