我正在寻找PHP函数的名称来从一组键值对构建一个查询字符串。请注意,我正在寻找内置的PHP 功能来做这件事,而不是自制的(这似乎都是google搜索返回)。有一个,我只是不记得它的名字或在php.net上找到它。 IIRC的名字并不那么直观。
答案 0 :(得分:288)
您正在寻找http_build_query()
。
答案 1 :(得分:22)
这是一个简单的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 );
}
答案 2 :(得分: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);
}
}
答案 3 :(得分:0)
但是对于反向这项工作,您可以使用:
void parse_str(str $input, array $output);
//for example:
$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first; // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz
parse_str($str, $output);
echo $output['first']; // value
echo $output['arr'][0]; // foo bar
echo $output['arr'][1]; // baz
祝你好运。
答案 4 :(得分:0)
由于这个问题对于PHP来说已经很老了,这是在(当前)非常流行的PHP框架Laravel中解决此问题的一种方法。
要在应用程序中对路径的查询字符串进行编码,请给您routes names,然后像这样使用route()
helper function:
route('documents.list.', ['foo' => 'bar']);
结果将类似于:
http://localhost/documents/list?foo=bar
另外请注意,如果您的路线具有任何路径段参数,例如/documents/{id}
,然后确保也将id
参数传递给route()
参数,否则默认使用第一个参数的值。
答案 5 :(得分:-2)
Implode会将数组合并为一个字符串,但是为了使一个kay / value对的SQL查询,您必须编写自己的函数。