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

明确起见,我有一个具有多个值的查询字符串,其中一个值将是数组值。我希望查询字符串值被视为数组-我不希望数组被分解,以便它与其他查询字符串变量难以区分。

另外,根据这篇文章的回答,作者建议不定义对数组的查询字符串支持。这准确吗?

编辑:

基于@Alex的回答,没有标准的方法来做到这一点,所以我的后续是什么是一个简单的方法来识别我正在阅读的参数是一个数组在PHP和Javascript?

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

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

或者这是一种不好的做法?


当前回答

你在问题中提到了PHP和Javascript,但没有在标签中提到。我提出这个问题的目的是将一个数组传递给MVC。网行动。

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

其他回答

您可以使用http_build_query从PHP中的数组生成url编码的查询字符串。当结果查询字符串将被展开时,你可以决定一个唯一的分隔符作为http_build_query方法的参数,因此当涉及到解码时,你可以检查使用了什么分隔符。如果它是你选择的唯一的一个,那么它将是数组querystring,否则它将是普通的querystring。

以下是我的结论:

提交多值表单字段,即通过GET/POST变量提交数组,可以通过几种不同的方式完成,因为没有必要详细说明标准。

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

?cars[]=Saab&cars[]=Audi (PHP将此读入数组的最佳方式) ?cars=Saab&cars=Audi(不好的方法- PHP只会记录最后一个值) ?汽车=萨博,奥迪(还没试过)

形式的例子

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

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

(注意:在这种情况下,将选择控件命名为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">

注意:使用field[]表示多个值的文档很少。在维基百科中关于查询字符串的多值键的部分,或者在W3C文档中处理多选择输入的部分,我没有看到任何提到它。


更新

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

查询字符串:

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

Rails:

"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.js, Wordpress, ASP.net中的示例注释


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

这对我来说很管用:

在link中,to属性具有值:

to="/filter/arr?fruits=apple&fruits=banana"

Route可以处理这个:

path="/filter/:arr"

对于多个数组:

to="filter/arr?fruits=apple&fruits=banana&vegetables=potato&vegetables=onion"

路线不变。

截图

更新: 为了实现这种字符串结构,query-string是最好的包。

例如:

import { stringify, parse } from 'query-string';

const queryParams={
   fruits:['apple','banana'],
   vegetables:['potato','onion']
}
//arrayFormat can be bracket or comma 
stringify(queryParams, { arrayFormat: 'bracket' });

注意,query-string模块列出了它支持的不同类型的数组编码(https://www.npmjs.com/package/query-string):

例如,{foo:['1', '2', '3']}可以被编码为:

'foo[]=1&foo[]=2&foo[]=3'
'foo[0]=1&foo[1]=2&foo[3]=3'
'foo=1,2,3'
'foo=1&foo=2&foo=3'
// Any custom separator can be used:
'foo=1|2|3'
// ... and more custom formats

这表明有很多解决方案被采用了……

你在问题中提到了PHP和Javascript,但没有在标签中提到。我提出这个问题的目的是将一个数组传递给MVC。网行动。

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