【问题标题】:Access multiple GET parameters in PHP without bracket notation在 PHP 中访问多个 GET 参数而不使用括号表示法
【发布时间】:2013-06-22 19:06:47
【问题描述】:

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

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

?foo=bar&foo=baz

应该会产生像这样的$_GET(或类似的):

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

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

【问题讨论】:

  • 是的,抱歉,确实,它会自己解析。但它仍然只是一个正则表达式和一个循环。
  • 序列化url中的数组?
  • @Dagon 我可以这样做,例如,允许 foo=bar,baz 并在 , 上拆分。但我想支持基本的“多个相同的查询键”方法,以便于 API 的使用。 (顺便说一句:它应该易于其他人使用。)

标签: php url query-string


【解决方案1】:

你可以试试这样的:

foreach($_GET as $slug => $value) {
#whatever you want to do, for example
print $_GET[$slug];
}

【讨论】:

  • 这只会打印一次baz。不幸的是,bar 完全被遮蔽了。
  • 你为什么不试试 ?foo[1]=bar&foo[2]=baz 等等。然后 $_GET["foo"] 将是一个数组,因此您可以在代码中使用它。
  • 可以。但是用例是一个 API,我希望 API 的用户尽可能简单地使用它。它是 API 的 URL 的简单装饰。
【解决方案2】:

没有内置方式支持?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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多