2

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

但是对于公共 API,我希望在 URL 中没有显式括号的情况下具有相同的行为。例如,查询

?foo=bar&foo=baz

应该导致这样的$_GET(或类似的):

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

有没有可能在 PHP 中轻松获得这种行为?即,在将查询字符串提供给之前不解析$_SERVER['QUERY_STRING']自己或 preg_replacing =with ?[]=parse_str()

4

2 回答 2

0

你可以尝试这样的事情:

foreach($_GET as $slug => $value) {
#whatever you want to do, for example
print $_GET[$slug];
}
于 2013-06-25T21:23:02.357 回答
0

没有内置的方式来支持?foo=bar&foo=baz.

Daniel Morell 提出了一种解决方案,该解决方案手动解析 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;
}
于 2021-07-09T01:56:19.347 回答