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


353

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

需要明确的是,我有一个带有多个值的查询字符串,其中一个是数组值。我希望将该查询字符串值视为一个数组-我不希望该数组爆炸,以使其与其他查询字符串变量没有区别。

另外,根据该帖子的答案,作者建议未定义对数组的查询字符串支持。这个准确吗?

编辑:

根据@Alex的回答,没有标准的方法可以执行此操作,因此我的后续工作是什么才是识别我正在读取的参数同时是PHPJavascript数组的简单方法?

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

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

还是这是不好的做法?


您正在使用什么框架?一些框架具有帮助将数组传递给查询字符串的方法。
keyboardP

@ keyboardP- PHP和Javascript,取决于用例
Yarin

2
myarray = value1,value2,value3
Serodis 2011年

18
@seroids:如果他必须传递逗号,问号,等号和不可打印的字符怎么办?
Berry Tsakala 2011年

Answers:


429

这是我想出的:

提交多值表单字段(即通过GET / POST var提交数组)可以用几种不同的方式完成,因为不一定要阐明标准。

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

  • ?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[],这样PHP会将生成的请求vars注册为数组)

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

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

注:使用field[]多个值实在是记录不完整。在查询字符串Wikipedia中关于多值键的部分中,或者在处理多选输入的W3C文档中,我没有看到任何提及。


更新

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

请求参数:

?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中的示例注释


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


3
我认为在Wiki或W3C之类的一般来源中未记录此功能的原因是Web框架通常不支持该功能。PHP和我认为Rails会自动将多个“ key []”查询参数转换为一个数组。其他人没有。
卡尔·G

3
nodejs querystring模块使用以下?cars=Saab&cars=Audi格式
SystemParadox

53
在快车(node.js的),都?cars=Saab&cars=Audi?cars[]=Saab&cars[]=Audi都被转换为阵列。但是,?cars=Saab最终以字符串形式出现,但是它?cars[]=Saab是一个包含单个元素的数组。
Trevor Dixon

5
您可以使用这种方法设置密钥吗?那么多维数组呢?
Qwerty 2014年

5
ASP.NET MVC似乎无法读取格式?cars[]=Saab&cars[]=Audi没有方括号或方括号需要索引/
Flibble先生15年

37

查询字符串携带文本数据,因此别无选择,只能展开数组,对其进行正确编码,然后以您选择的代表性格式传递它:

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

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


好的,谢谢您的澄清。您能看到我修改过的问题吗?是否有必要对键进行p1 ... pn的操作,或者我可以仅将多个键命名为“ p”,这样我就知道它们都属于同一数组?
Yarin

1
您可以使用相同的名称;stackoverflow.com/questions/2203430/…或只是p = aa,bb,cc,这是Serodis评论的最明显的方法。
Alex K.

JSON.stringify和非常有用JSON.parse
charliebrownie '02

1
一种简单而通用的表示形式是JSON,在PHP中使用json_encodethen rawurlencodejson_decode另一页。
爱德华

20

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

但是,有一些方法:

  1. 有一种PHP方式,在URL查询中使用方括号([])。例如,?array_name[]=item&array_name[]=item_2据说尽管这样的查询虽然没有得到很好的记录,但是仍然可以运行,PHP自动将其转换为数组。资料来源:https : //stackoverflow.com/a/9547490/3787376

  2. 如果对象数据交换格式(例如JSON- 官方网站PHP文档)具有与JSON一样的在字符串之间进行变量转换的方法,则也可以使用。
    HTTP get请求还需要一个url-encoder(适用于大多数编程语言),才能正确编码字符串数据。

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

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

$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.

1
Express.js还支持在4.13.4上测试的方括号表示法。
史蒂夫·凯莱特

7

我觉得这对于希望将查询字符串中的数组传递给servlet的人很有帮助。我在查询字符串下面进行了测试,并能够使用req.getgetParameterValues();获取数组值。方法。以下是我通过浏览器传递的查询字符串。

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

复选框是我的参数数组。


5

这对我有用:

在链接中,to属性具有值:

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

路线可以处理此问题:

path="/filter/:arr"

对于多个数组:

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

路线保持不变。

屏幕截图

在此处输入图片说明


2

您在问题中提到了PHP和Javascript,但在标记中却没有提及。我达到此问题的目的是将数组传递给MVC.Net操作。

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


2
虽然此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。
安德鲁

@Andrew这不是仅链接的答案。“期望的格式是您在问题中提出的格式,其中多个参数具有相同的名称。”
DCShannon 2015年

2

我使用React和Rails。我做了:

js

  let params = {
    filter_array: ['A', 'B', 'C']
  }

  ...

  //transform params in URI

  Object.keys(params).map(key => {
    if (Array.isArray(params[key])) {
      return params[key].map((value) => `${key}[]=${value}`).join('&')
    }
  }
  //filter_array[]=A&filter_array[]=B&filter_array[]=C

1

您可以使用http_build_query从PHP中的数组生成URL编码的查询字符串。在扩展结果查询字符串的同时,您可以确定要用作http_build_query方法参数的唯一分隔符,因此在解码时,可以检查使用了什么分隔符。如果是您选择的唯一字符串,则该字符串将为查询字符串数组,否则将为常规查询字符串。


1

尽管URL部分没有标准,但是JavaScript有一种标准。如果将包含数组的对象传递给URLSearchParams,并对其进行调用toString(),它将把它转换成逗号分隔的项目列表:

let data = {
  str: 'abc',
  arr: ['abc', 123]
}

new URLSearchParams(data).toString();  # ?str=abc&arr=abc,123

0

检查parse_string功能http://php.net/manual/zh/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

?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.