如何在查询字符串中传递数组?

有一个通过查询字符串传递数组的标准方式吗?

要清楚,我有一个查询字符串与多个值,其中之一将是一个数组值。 我希望该查询字符串值被视为一个数组 – 我不希望该数组被爆炸,以便它与其他查询字符串变量无法区分。

另外,根据这个帖子的回答 ,作者建议查询字符串支持数组没有定义。 这是准确的吗?

编辑:

基于@ Alex的回答,没有这样做的标准方式,所以我的后续是什么是一个简单的方法来认识到 ,我正在阅读的参数是PHPJavascript中的数组?

将多个参数命名为同一个名称是可以接受的,那样我就会知道它们属于一个数组? 例:

?myarray=value1&myarray=value2&myarray=value3... 

或者这是不好的做法?

以下是我想到的:

提交多值表单字段,即通过GET / POST vars提交数组,可以通过几种不同的方式来完成,因为标准不一定是明确的。

发送多值字段或数组的三种可能方式是:

  • ?cars[]=Saab&cars[]=Audi (最好的方式 – PHP读取这个数组)
  • ?cars=Saab&cars=Audi (坏的方式 – PHP将只注册最后一个值)
  • ?cars=Saab,Audi (没有试过这个)

表格示例

在表单上,​​多值字段可以采用选择框的形式设置为多个

 <form> <select multiple="multiple" name="cars[]"> <option>Volvo</option> <option>Saab</option> <option>Mercedes</option> </select> </form> 

(注意:在这种情况下,命名选择控件some_name[]是非常重要的,这样生成的请求变量将被PHP注册为一个数组)

…或作为多个隐藏的字段具有相同的名称

 <input type="hidden" name="cars[]" value="Volvo"> <input type="hidden" name="cars[]" value="Saab"> <input type="hidden" name="cars[]" value="Mercedes"> 

注意:field[]用于多个值实际上记录不准确。 在查询字符串 – 维基百科中的多值键部分或处理多选输入的W3C文档中 ,我没有看到任何提及。


UPDATE

正如评论者所指出的那样,这是非常多的框架。 一些例子:

查询字符串:

 ?list_a=1&list_a=2&list_a=3&list_b[]=1&list_b[]=2&list_b[]=3&list_c=1,2,3 

扶手:

 "list_a": "3", "list_b":[ "1", "2", "3" ], "list_c": "1,2,3" 

角度:

  "list_a": [ "1", "2", "3" ], "list_b[]": [ "1", "2", "3" ], "list_c": "1,2,3" 

(角度讨论 )

请参阅node.jsWordPressASP.net中的示例注释


维护顺序:还有一件事要考虑的是,如果你需要维护你的项目的顺序 (即数组作为一个有序的列表),你真的只有一个选项,它是传递一个分隔的值列表,并明确地将其转换为一个阵列你自己。

一个查询字符串携带文本数据,因此除了爆炸数组,正确地对其进行编码并将其传递给您所选择的表示格式外,别无选择:

p1=value1&pN=valueN...
data=[value1,...,valueN]
data={p1:value1,...,pN:valueN}

然后在你的服务器端代码中解码。

我不认为有一个标准。
每个网络环境都为这些事情提供了自己的“标准”。 此外,对于任何东西(通常在某些浏览器上256个字节的限制),url通常太短。 当然,更长的数组/数据可以通过POST请求发送。

但是,有一些方法:

  1. 有一种PHP方法,在URL查询中使用方括号( [] )。 例如,像?array_name[]=item&array_name[]=item_2这样的查询虽然记录不完整,但已经被认为是可行的,PHP自动将其转换为数组。 资料来源: https : //stackoverflow.com/a/9547490/3787376

  2. 对象数据交换格式(如JSON – 官方网站 , PHP文档 )也可以使用,如果他们有像JSON那样将变量转换成字符串和从字符串转换的方法。
    对于HTTP请求来正确编码字符串数据,还需要一个url编码器(可用于大多数编程语言)。

尽管“方括号方法”很简单并且可行,但它仅限于PHP和数组。
如果需要其他类型的变量(如PHP中的语言的查询字符串中的类或传递变量),则建议使用JSON方法。

JSON方法(方法2)的PHP示例:

 $myarray = array(2, 46, 34, "dfg"); $serialized = json_encode($myarray) $data = 'myarray=' . rawurlencode($serialized); // Send to page via cURL, header() or other service. 

接收页面的代码(PHP):

 $myarray = json_decode($_GET["myarray"]); // Or $_POST["myarray"] if a post request. 

我觉得这对那些正在寻找将数组传递给一个servlet的查询字符串会有所帮助。 我测试下面的查询字符串,并能够使用req.getgetParameterValues()获取数组值。 方法。 以下是我通过浏览器传递的查询字符串。

 "http://localhost:8080/ServletsTutorials/*.html?myname=abc&initial=xyz&checkbox=a&checkbox=b" 

复选框是我的参数数组在这里。

您可以使用http_build_query从PHP中的数组生成URL编码的查询字符串。 虽然得到的查询字符串将被扩展,但您可以决定使用唯一的分隔符作为http_build_query方法的参数,因此在解码时可以检查使用的分隔符。 如果这是你选择的唯一一个,那么这将是数组查询字符串,否则它将是正常querystrings。

你提到PHP和Javascript在你的问题,但不是在标签。 我意图将一个数组传递给MVC.Net操作,从而达到了这个问题。

我在这里找到了我的问题的答案:预期的格式是您在问题中提出的格式,多个参数具有相同的名称。

检查parse_string函数http://php.net/manual/en/function.parse-str.php

它将返回查询字符串中的所有变量,包括数组。

来自php.net的示例:

 <?php $str = "first=value&arr[]=foo+bar&arr[]=baz"; parse_str($str); echo $first;  // value echo $arr[0]; // foo bar echo $arr[1]; // baz parse_str($str, $output); echo $output['first'];  // value echo $output['arr'][0]; // foo bar echo $output['arr'][1]; // baz ?>