【问题标题】:A $_GET input parameter that is an Array一个 $_GET 输入参数,它是一个数组
【发布时间】:2010-05-25 23:03:53
【问题描述】:

我正在尝试将 3 个参数传递给脚本,其中第三个参数 $_GET['value3'] 应该是一个数组

$_GET['value1'] 
$_GET['value2'] 
$_GET['value3'] //an array of items

我这样调用脚本:(注意我的 value3 语法,我不确定它是否正确)

http://localhost/test.php?value1=test1&value2=test2&value3=[the, array, values]

然后我使用 foreach 循环遍历第三个参数 value3,即数组

//process the first input $_GET['value1']

//process the second input $_GET['value2']

//process the third input $_GET['value3'] which is the array
foreach($_GET['value3'] as $arrayitem){
    echo $arrayitem; 
}

但我收到错误Invalid argument supplied for foreach()

我不确定我的方法是否正确。有人可以澄清一下你将如何去做这种事情

【问题讨论】:

    标签: php arrays get


    【解决方案1】:

    没有“将数组作为 URL 参数传递”(或表单值,就此而言,因为这是同一件事)这样的事情。这些是字符串,除此之外发生在它们身上的任何事情都是内置于您的应用程序服务器中的魔法,因此它是不可移植的。

    PHP 恰好支持 &value3[]=the&value3[]=array&value3[]=values 表示法,可以自动为您创建 $_GET['value3'] 作为数组,但这对 PHP 来说是特殊的,不一定适用于其他地方。

    您也可以直接使用更简洁的 URL,例如:value3=the,array,values,然后在 PHP 脚本中使用 explode(',', $_GET['value3']) 创建一个数组。当然,这意味着您的分隔符 char 不能是值的一部分。

    要通过 HTTP 明确地传输结构化数据,请使用为此目的制定的格式(即:JSON),然后在 PHP 端使用 json_decode()

    【讨论】:

    • +1 以获得详尽的解释以及应用服务器的详细信息。
    • 我认为在使用该语言进行开发时依赖该语言功能还不错,哈哈..
    • @webbiedave:干净的 URL > 不那么干净的 URL。而“代码更简洁”当然取决于你从哪里看。我想说一个带有逗号的 URL 比一个花哨的 PHP 表示法更容易生成,从而产生更清晰的代码。
    • 如果您尝试在不更改任何 URL 的情况下重写整个应用程序,那么用另一种语言实现 PHP 的 URL 解析样式可能不会非常困难。
    • @Dan Heberden:不,当然不是。那不是我的意思。但是 PHP 的这些神奇特性让你很容易相信实际上可以通过 URL 参数传输数组(我在这里已经多次看到这个概念),我认为这将是一个可以说这实际上并没有发生。恕我直言,明确区分 PHP 所做的和 HTTP 所做的很重要。
    【解决方案2】:

    试试

    http://localhost/test.php?value1=test1&value2=test2&value3[]=the&value3[]=array&value3[]=values
    

    【讨论】:

      【解决方案3】:

      对于数组,您需要将查询参数传递为

      value3[]=abc&value3[]=pqr&value3[]=xyz
      

      【讨论】:

      • 你应该删除那些单引号。
      【解决方案4】:

      你也可以在字符串中转换索引的名称

      ?value1[a]=test1a&value1[b]=test1b&value2[c][]=test3a&value2[c][]=test3b
      

      $_GET['value1']['a'] = test1a
      $_GET['value1']['b'] = test1b
      $_GET['value2']['c'] = array( 'test3a', 'test3b' );
      

      【讨论】:

        【解决方案5】:

        http://php.net/manual/en/reserved.variables.get.php 看看上面的链接。。 您将看到 GET 方法是如何实现的。 发生的情况是获取 URL,使用 '&' 分隔,然后将它们添加为键值对。

           public function fixGet($args) {
            if(count($_GET) > 0) {
                if(!empty($args)) {
                    $lastkey = "";
                    $pairs = explode("&",$args);
                    foreach($pairs as $pair) {
                        if(strpos($pair,":") !== false) {
                            list($key,$value) = explode(":",$pair);
                            unset($_GET[$key]);
                            $lastkey = "&$key$value";
                        } elseif(strpos($pair,"=") === false)
                            unset($_GET[$pair]);
        
                        else {
                            list($key, $value) = explode("=",$pair);
                            $_GET[$key] = $value;
                        }
                    }
                }
                return "?".((count($_GET) > 0)?http_build_query($_GET).$lastkey:"");
            }
        

        由于它们是作为键值对添加的,因此您不能在 GET 方法中传递数组...

        【讨论】:

          【解决方案6】:

          以下方法也可以:

          http://localhost/test.php?value3[]=the&value3[]=array&value3[]=values

          更高级的方法是序列化 PHP 数组并将其打印在您的链接中:

          http://localhost/test.php?value3=a:3:{i:0;s:3:"the";i:1;s:5:"array";i:2;s:6:"values";}

          基本上也可以。

          【讨论】:

          • 第一种形式在 PHP 中不起作用。如果同一个键多次出现,PHP 将使用最后分配的值。仅当键中存在[] 字符时,才会执行数组追加。
          猜你喜欢
          • 2019-12-31
          • 2017-10-21
          • 1970-01-01
          • 2013-10-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-31
          • 2018-05-23
          相关资源
          最近更新 更多