在PHP中访问多个GET参数,不带括号表示法

时间:2013-06-25 20:10:32

标签: php url query-string

当参数名后跟$_GET[]时,PHP会自动在[keyname]中创建数组。

然而,对于公共API,我喜欢在URL中没有明确括号的情况下拥有相同的行为。例如,查询

?foo=bar&foo=baz

应该产生$_GET(或类似),如下所示:

$_GET["foo"] == array("bar", "baz");

是否有可能轻松在PHP中获得此行为?即,在将$_SERVER['QUERY_STRING']提供给=之前,不要自己解析[]=或在查询字符串中使用parse_str() preg_replacing {{1}}?

2 个答案:

答案 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;
}