当参数名后跟$_GET
或[]
时,PHP会自动在[keyname]
中创建数组。
然而,对于公共API,我喜欢在URL中没有明确括号的情况下拥有相同的行为。例如,查询
?foo=bar&foo=baz
应该产生$_GET
(或类似),如下所示:
$_GET["foo"] == array("bar", "baz");
是否有可能轻松在PHP中获得此行为?即,在将$_SERVER['QUERY_STRING']
提供给=
之前,不要自己解析[]=
或在查询字符串中使用parse_str()
preg_replacing {{1}}?
答案 0 :(得分:0)
foreach($_GET as $slug => $value) {
#whatever you want to do, for example
print $_GET[$slug];
}
答案 1 :(得分:0)
没有内置的方式来支持 ?foo=bar&foo=baz
。
Daniel Morell proposed a solution 手动解析 URL 字符串并在存在多个参数实例时迭代构建数组,或者在仅存在一个参数时返回字符串(即匹配默认行为)。
它支持两种类型的 URL,带括号和不带括号:
?foo=bar&foo=baz // works
?foo[]=bar&foo[]=baz // works
/**
* Parses GET and POST form input like $_GET and $_POST, but without requiring multiple select inputs to end the name
* in a pair of brackets.
*
* @param string $method The input method to use 'GET' or 'POST'.
* @param string $querystring A custom form input in the query string format.
* @return array $output Returns an array containing the input keys and values.
*/
function bracketless_input( $method, $querystring=null ) {
// Create empty array to
$output = array();
// Get query string from function call
if( $querystring !== null ) {
$query = $querystring;
// Get raw POST data
} elseif ($method == 'POST') {
$query = file_get_contents('php://input');
// Get raw GET data
} elseif ($method == 'GET') {
$query = $_SERVER['QUERY_STRING'];
}
// Separerate each parameter into key value pairs
foreach( explode( '&', $query ) as $params ) {
$parts = explode( '=', $params );
// Remove any existing brackets and clean up key and value
$parts[0] = trim(preg_replace( '(\%5B|\%5D|[\[\]])', '', $parts[0] ) );
$parts[0] = preg_replace( '([^0-9a-zA-Z])', '_', urldecode($parts[0]) );
$parts[1] = urldecode($parts[1]);
// Create new key in $output array if param does not exist.
if( !key_exists( $parts[0], $output ) ) {
$output[$parts[0]] = $parts[1];
// Add param to array if param key already exists in $output
} elseif( is_array( $output[$parts[0]] ) ) {
array_push( $output[$parts[0]], $parts[1] );
// Otherwise turn $output param into array and append current param
} else {
$output[$parts[0]] = array( $output[$parts[0]], $parts[1] );
}
}
return $output;
}