Php 如何在查询字符串中传递数组?
是否有通过查询字符串传递数组的标准方法 需要说明的是,我有一个包含多个值的查询字符串,其中一个是数组值。我希望该查询字符串值被视为一个数组-我不希望该数组被分解,使其与其他查询字符串变量无法区分 此外,根据这一点,作者建议没有定义对数组的查询字符串支持。这准确吗 编辑:Php 如何在查询字符串中传递数组?,php,arrays,query-string,querystringparameter,Php,Arrays,Query String,Querystringparameter,是否有通过查询字符串传递数组的标准方法 需要说明的是,我有一个包含多个值的查询字符串,其中一个是数组值。我希望该查询字符串值被视为一个数组-我不希望该数组被分解,使其与其他查询字符串变量无法区分 此外,根据这一点,作者建议没有定义对数组的查询字符串支持。这准确吗 编辑: ?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_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"
根据@Alex的回答,没有标准的方法可以做到这一点,因此我的后续工作是如何简单地识别我正在读取的参数是PHP和Javascript中的数组
是否可以将多个参数命名为相同的名称,这样我就知道它们属于一个数组?例如:
?myarray=value1&myarray=value2&myarray=value3...
或者这是一种不好的做法?查询字符串携带文本数据,因此除了分解数组、正确编码并以您选择的代表性格式传递之外,别无选择:
p1=value1&pN=valueN…
数据=[value1,…,valueN]
data={p1:value1,…,pN:valueN}
然后用服务器端代码对其进行解码。我认为没有标准。
每个web环境都为这些事情提供了自己的“标准”。此外,url通常太短(某些浏览器限制256字节)。当然,更长的数组/数据可以通过POST请求发送 但是,有一些方法:
?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"
[
,]
)。例如,一个查询,如?array_name[]=item&array_name[]=item_2
,尽管没有很好的文档记录,PHP会自动将其转换为数组。资料来源:此外,HTTP get请求还需要url编码器(适用于大多数编程语言)来正确编码字符串数据
如果需要其他类型的变量,例如使用PHP以外的语言在查询字符串中传递类或变量,建议使用JSON方法 JSON方法(方法2)的PHP示例: 接收页面代码(PHP):
可以使用从PHP中的数组生成URL编码的查询字符串。虽然生成的查询字符串将被扩展,但您可以决定一个唯一的分隔符作为
http\u build\u query
方法的参数,因此在解码时,您可以检查使用了什么分隔符。如果它是您选择的唯一查询字符串,那么它将是数组查询字符串,否则它将是普通的查询字符串。以下是我得出的结论:
提交多值表单字段,即通过GET/POST vars提交数组,可以通过几种不同的方式完成,因为不一定要说明标准
发送多值字段或数组的三种可能方式是:
(最佳方式-PHP将其读入数组)?cars[]=Saab&cars[]=Audi
(坏方法-PHP将只注册最后一个值)?cars=Saab&cars=Audi
(还没试过)?cars=Saab,Audi
<form>
<select multiple="multiple" name="cars[]">
<option>Volvo</option>
<option>Saab</option>
<option>Mercedes</option>
</select>
</form>
<input type="hidden" name="cars[]" value="Volvo">
<input type="hidden" name="cars[]" value="Saab">
<input type="hidden" name="cars[]" value="Mercedes">
注意:对多个值使用
字段[]
的记录非常糟糕。在中关于多值键的部分中,或者在处理多选输入的部分中,我没有看到任何提到它的内容
更新 正如评论者所指出的,这是非常特定于框架的。一些例子: 查询字符串:
?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"
轨道:
?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"
角度:
?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.js,Wordpress,ASP.net
维持秩序:
还有一件事要考虑的是,如果您需要维护项目的顺序(即数组作为有序列表),则实际上只有一个选项,即传递一个分隔的值列表,并将其显式转换为一个数组。 检查<代码> PARSESHIGRITE < /COD>函数 它将返回查询字符串中的所有变量,包括数组 来自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
?>
我觉得这对那些希望将数组以查询字符串形式传递给servlet的人来说会很有帮助。我测试了下面的查询字符串,并能够使用req.getParameterValues()获取数组值;方法。下面是我通过浏览器传递的查询字符串
http://localhost:8080/ServletsTutorials/*.html?
myname=abc&initial=xyz&checkbox=a&checkbox=b
复选框是我的参数数组。您在问题中提到了PHP和Javascript,但在标记中没有提到。我提出这个问题的目的是将数组传递给MVC.Net操作 我找到了我问题的答案:预期的格式是您在问题中提出的格式,多个参数具有相同的名称。这对我很有用: 在链接中,“到”属性具有以下值:
to="/filter/arr?fruits=apple&fruits=banana"
Route可以处理这个问题:
path="/filter/:arr"
对于多个阵列:
to="filter/arr?fruits=apple&fruits=banana&vegetables=potato&vegetables=onion"
路线不变
屏幕截图
我使用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
虽然URL部分没有标准,但是JavaScript有一个标准。如果将包含数组的对象传递给
URLSearchParams
,并对其调用toString()
,它会将其转换为以逗号分隔的项目列表:
let数据={
str:‘abc’,
arr:[abc',123]
}
新的URLSearchParams(data.toString();
//str=abc&arr=abc,123(带e