php 具有相同标识符的多个 HTTP GET 参数

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3980228/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 11:38:10  来源:igfitidea点击:

Multiple HTTP GET parameters with the same identifier

phpparametershttp-get

提问by MatsT

Let's say I am getting requests such as:

假设我收到以下请求:

http://www.example.com/index.php?id=123&version=3&id=234&version=4

http://www.example.com/index.php?id=123&version=3&id=234&version=4

Is it possible to extract these in a simple way inside my php code? I realize I could get the entire querystring with javascript using window.location.href and handle it manually but I'm looking for something more elegant. The requests can contain any number of version/id pairs but I can assume that the query is well-formed and have no obligation to handle invalid strings.

是否可以在我的 php 代码中以简单的方式提取这些?我意识到我可以使用 window.location.href 使用 javascript 获取整个查询字符串并手动处理它,但我正在寻找更优雅的东西。请求可以包含任意数量的版本/ID 对,但我可以假设查询格式正确并且没有义务处理无效字符串。

采纳答案by Brian Driscoll

According to this comment from the PHP manual, PHP's query string parser will drop duplicate params... so I don't think that PHP is a good fit for what you want to do (except in that it has the same capacity as javascript to get the raw query string, with which you can do whatever you want)

根据PHP 手册中的这条评论,PHP 的查询字符串解析器将删除重复的参数......所以我认为 PHP 不适合您想要做的事情(除了它具有与获取原始查询字符串,你可以用它做任何你想做的事)

回答by Jacob Mattison

If you can change the field name to include [], then PHP will create an array containing all of the matching values:

如果您可以将字段名称更改为 include [],那么 PHP 将创建一个包含所有匹配值的数组:

http://www.example.com/index.php?id[]=123&version[]=3&id[]=234&version[]=4

If you don't have the ability to change the field names, then as you say, you'll have to parse the querystring yourself.

如果您无法更改字段名称,那么正如您所说,您必须自己解析查询字符串。

回答by Quentin

Assuming you have some control over the request, suffix the name with []and PHP will generate arrays instead of dropping all but one.

假设您对请求有一定的控制权,为名称添加后缀[],PHP 将生成数组,而不是只删除一个数组。

http://www.example.com/index.php?id[]=123&version[]=3&id[]=234&version[]=4

Since they are pairsyou'll probably want to fix the order they appear in using indexes.

由于它们是成对的,您可能希望使用索引来修复它们出现的顺序。

http://www.example.com/index.php?id[0]=123&version[0]=3&id[1]=234&version[1]=4

回答by Vitor Marques

Just extract the keys and values of $_GET, use the function as:

只需提取 $_GET 的键和值,将函数用作:

print_array('$_GET...',$_GET);

... and the function code will be:

...并且功能代码将是:

function print_array($title, $arr) {
    echo '<table width="100%" style="padding:10;">';
    echo '<tr><td width="30%" style="text-align:right; background-color:bisque;">key of </td><td style="background-color:bisque;">'.$title.'</td></tr>';
    foreach($arr as $key => $value) {
        echo '<tr>';
            echo '<td style="text-align:right; color:grey;">';
                echo $key;
            echo '</td>';
            echo '<td>';
                echo $value;
            echo '</td>';
        echo '</tr>';
    }
    echo '</table>';
}

回答by atoms

Not as rounded or reliable as methods mentioned above but I use this to remove the need to []in urls without worrying about rewriting.

不像上面提到的方法那样圆润或可靠,但我使用它来消除对[]url的需求,而不必担心重写。

$aQuery = explode("&", $_SERVER['QUERY_STRING']);
$aQueryOutput = array();
foreach ($aQuery as $param) {
    if(!empty($param)){
        $aTemp = explode('=', $param, 2);
        if(isset($aTemp[1]) && $aTemp[1] !== ""){
            list($name, $value) = explode('=', $param, 2);
            $aQueryOutput[ strtolower(urldecode($name)) ][] = urldecode(preg_replace('/[^a-z 0-9\'+-]/i', "", $value));
        }
    }
}