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

是否有通过查询字符串传递数组的标准方法?

为了清楚起见,我有一个具有多个值的查询字符串,其中一个值是数组值。我希望将查询字符串值视为数组 - 我不希望数组被分解,使其与其他查询字符串变量无法区分。

此外,根据这篇文章的答案,作者建议没有定义对数组的查询字符串支持。这是准确的吗?

编辑:

根据@Alex的答案,没有标准的方法来做到这一点,所以我的后续工作是,那么有什么简单的方法可以识别我正在读取的参数是PHPJavascript中的数组?

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

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

还是这是一种不好的做法?


答案 1

以下是我的发现:

提交多值表单字段,即通过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>

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

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

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

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


更新

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

查询字符串:

?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.jsWordpress ASP.net 中的示例,请参阅注释


维持秩序:需要考虑的另一件事是,如果您需要维护项目的顺序(即数组作为有序列表),您实际上只有一个选项,即传递分隔的值列表,并自己将其显式转换为数组。


答案 2

查询字符串携带文本数据,因此除了分解数组、正确编码并以您选择的具象格式传递数组之外,别无选择:

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

然后在服务器端代码中对其进行解码。