代码之家  ›  专栏  ›  技术社区  ›  MatsT

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

  •  11
  • MatsT  · 技术社区  · 15 年前

    比如说,我收到了如下请求:

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

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

    5 回复  |  直到 9 年前
        1
  •  7
  •   Brian Driscoll    15 年前

    根据 this comment from the PHP manual ,PHP的查询字符串分析器将删除重复的参数…所以我不认为PHP适合你想要做的事情(除了它有着与javascript相同的能力来获取原始查询字符串,你可以用它做任何你想做的事情)

        2
  •  24
  •   Jacob Mattison    13 年前

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

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

    如果您没有更改字段名的能力,那么如您所说,您必须自己分析查询字符串。

        3
  •  1
  •   Quentin    15 年前

    假设您对请求有一些控制权,在名称后加上 [] PHP将生成数组,而不是删除除一个以外的所有数组。

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

    既然它们是 对 您可能希望修复它们在使用索引时的显示顺序。

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

    只需提取$\u get的键和值,使用函数如下:

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

    …功能代码为:

    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>';
    }
    
        5
  •  0
  •   atoms    9 年前

    不像上面提到的方法那样圆润或可靠,但我用它来消除 [] 在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));
            }
        }
    }