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的回答,没有标准的方法可以做到这一点,因此我的后续工作是如何简单地识别我正在读取的参数是PHPJavascript中的数组

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

?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"
  • 有一种PHP方式,在URL查询中使用方括号(
    [
    ]
    )。例如,一个查询,如
    ?array_name[]=item&array_name[]=item_2
    ,尽管没有很好的文档记录,PHP会自动将其转换为数组。资料来源:

  • 如果对象数据交换格式(如JSON-,)具有与JSON一样将变量转换为字符串或从字符串转换变量的方法,则也可以使用该格式。
    此外,HTTP get请求还需要url编码器(适用于大多数编程语言)来正确编码字符串数据

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

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

    接收页面代码(PHP):


    可以使用从PHP中的数组生成URL编码的查询字符串。虽然生成的查询字符串将被扩展,但您可以决定一个唯一的分隔符作为
    http\u build\u query
    方法的参数,因此在解码时,您可以检查使用了什么分隔符。如果它是您选择的唯一查询字符串,那么它将是数组查询字符串,否则它将是普通的查询字符串。

    以下是我得出的结论:

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