Làm thế nào để vượt qua một mảng trong chuỗi truy vấn?


353

Có cách tiêu chuẩn nào để truyền một mảng qua chuỗi truy vấn không?

Để rõ ràng, tôi có một chuỗi truy vấn có nhiều giá trị, một trong số đó sẽ là một giá trị mảng. Tôi muốn giá trị chuỗi truy vấn đó được coi là một mảng - Tôi không muốn mảng bị nổ để nó không thể phân biệt được với các biến chuỗi truy vấn khác.

Ngoài ra, theo câu trả lời bài đăng này , tác giả cho rằng hỗ trợ chuỗi truy vấn cho mảng không được xác định. Nó thật sự đúng?

BIÊN TẬP:

Dựa trên câu trả lời của @ Alex, không có cách tiêu chuẩn nào để thực hiện việc này, vì vậy theo dõi của tôi là cách dễ dàng để nhận ra rằng thông số tôi đang đọc là một mảng trong cả PHPJavascript ?

Có thể chấp nhận đặt tên cho nhiều thông số cùng tên và theo cách đó tôi sẽ biết rằng chúng thuộc về một mảng? Thí dụ:

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

Hay đây sẽ là thực hành xấu?


Bạn đang sử dụng khuôn khổ nào? Một số khung công tác có các phương thức để giúp truyền các mảng cho các truy vấn.
bàn

@ keyboardP- PHP và Javascript, tùy theo trường hợp sử dụng
Yarin

2
Tại sao bạn muốn làm điều đó khi bạn chỉ có thể làm :? Myarray = value1, value2, value3
Serodis

18
@seroids: nếu anh ta phải vượt qua dấu phẩy, dấu hỏi, dấu bằng và ký tự không in được thì sao?
Berry Tsakala

Câu trả lời:


429

Đây là những gì tôi đã tìm ra:

Gửi các trường biểu mẫu đa giá trị, tức là gửi mảng thông qua các tệp GET / POST, có thể được thực hiện theo nhiều cách khác nhau, vì một tiêu chuẩn không nhất thiết phải được nêu ra.

Ba cách có thể để gửi các trường hoặc mảng đa giá trị sẽ là:

  • ?cars[]=Saab&cars[]=Audi (Cách tốt nhất- PHP đọc điều này thành một mảng)
  • ?cars=Saab&cars=Audi (Cách xấu- PHP sẽ chỉ đăng ký giá trị cuối cùng)
  • ?cars=Saab,Audi (Chưa thử cái này)

Mẫu ví dụ

Trên một biểu mẫu, các trường đa giá trị có thể ở dạng hộp chọn được đặt thành nhiều :

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

(LƯU Ý: Trong trường hợp này, điều quan trọng là đặt tên cho điều khiển chọn some_name[], để các vars yêu cầu kết quả sẽ được đăng ký dưới dạng một mảng bởi PHP)

... hoặc dưới dạng nhiều trường ẩn có cùng tên :

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

LƯU Ý: Sử dụng field[]cho nhiều giá trị thực sự là tài liệu kém. Tôi không thấy bất kỳ đề cập nào về nó trong phần về các khóa đa giá trị trong chuỗi Truy vấn - Wikipedia hoặc trong các tài liệu W3C liên quan đến các đầu vào đa lựa chọn.


CẬP NHẬT

Như các nhà bình luận đã chỉ ra, đây là rất nhiều khung cụ thể. Vài ví dụ:

Chuỗi truy vấn:

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

Đường ray:

"list_a": "3", 
"list_b":[
    "1",
    "2",
    "3"
  ], 
"list_c": "1,2,3"

Góc cạnh:

 "list_a": [
    "1",
    "2",
    "3"
  ],
  "list_b[]": [
    "1",
    "2",
    "3"
  ],
  "list_c": "1,2,3"

( Thảo luận góc cạnh )

Xem bình luận cho các ví dụ trong node.js , Wordpress , ASP.net


Duy trì trật tự: Một điều nữa cần xem xét là nếu bạn cần duy trì thứ tự các mặt hàng của mình (tức là mảng dưới dạng danh sách được sắp xếp), bạn thực sự chỉ có một tùy chọn, đó là chuyển một danh sách các giá trị được phân tách và chuyển đổi rõ ràng thành một mảng chính mình.


3
Tôi nghĩ lý do mà chức năng này không được ghi nhận trong các nguồn chung như Wiki hay W3C là vì nó thường không được hỗ trợ bởi các khung web. PHP và tôi nghĩ Rails tự động chuyển đổi nhiều tham số truy vấn "key []" thành một mảng. Những người khác thì không.
Carl G

3
Mô-đun truy vấn của nodejs sử dụng ?cars=Saab&cars=Audibiểu mẫu
SystemParadox

53
Trong express (node.js), cả hai ?cars=Saab&cars=Audi?cars[]=Saab&cars[]=Audiđược chuyển thành mảng. Tuy nhiên, ?cars=Saabkết thúc dưới dạng một chuỗi, nhưng ?cars[]=Saablà một mảng với một phần tử duy nhất.
Trevor Dixon

5
Bạn có thể thiết lập khóa bằng cách sử dụng phương pháp này? Và những gì về mảng đa chiều?
Qwerty

5
ASP.NET MVC dường như không đọc định dạng ?cars[]=Saab&cars[]=AudiKhông có dấu ngoặc vuông hoặc dấu ngoặc vuông cần chỉ mục /
Ông Flibble

37

Một chuỗi truy vấn mang dữ liệu văn bản để không có tùy chọn nào ngoài việc làm nổ mảng, mã hóa chính xác và chuyển nó theo định dạng đại diện mà bạn chọn:

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

và sau đó giải mã nó trong mã phía máy chủ của bạn.


OK cảm ơn đã làm rõ. Bạn có thể xem câu hỏi đã sửa đổi của tôi không - có cần thiết phải làm p1 ... pn, cho các khóa hay tôi chỉ có thể đặt tên cho nhiều khóa là 'p', và theo cách đó tôi sẽ biết tất cả chúng thuộc cùng một mảng?
Yarin

1
Bạn có thể sử dụng cùng tên; stackoverflow.com/questions/2203430/ Mạnh hoặc chỉ p = aa, bb, cc đó là cách rõ ràng nhất như Serodis nhận xét.
Alex K.

rất hữu ích với JSON.stringifyJSON.parse!
charliebrownie

1
Một định dạng biểu diễn đơn giản và phổ biến là JSON, trong PHP sử dụng json_encodesau đó rawurlencodejson_decodetrên trang khác.
Edward

20

Tôi không nghĩ có một tiêu chuẩn.
Mỗi môi trường web cung cấp 'tiêu chuẩn' riêng cho những điều đó. Ngoài ra, url thường quá ngắn cho mọi thứ (giới hạn 256 byte trên một số trình duyệt). Tất nhiên các mảng / dữ liệu dài hơn có thể được gửi với các yêu cầu POST.

Tuy nhiên, có một số phương pháp:

  1. Có một cách PHP, sử dụng dấu ngoặc vuông ( [, ]) trong các truy vấn URL. Ví dụ, một truy vấn như ?array_name[]=item&array_name[]=item_2đã được cho là hoạt động, mặc dù được ghi chép kém, với PHP sẽ tự động chuyển đổi nó thành một mảng. Nguồn: https://stackoverflow.com/a/9547490/3787376

  2. Các định dạng trao đổi dữ liệu đối tượng (ví dụ JSON - trang web chính thức , tài liệu PHP ) cũng có thể được sử dụng nếu chúng có các phương thức chuyển đổi các biến thành và từ các chuỗi như JSON.
    Ngoài ra, một bộ mã hóa url (có sẵn cho hầu hết các ngôn ngữ lập trình) là bắt buộc đối với các yêu cầu nhận HTTP để mã hóa dữ liệu chuỗi chính xác.

Mặc dù "phương pháp ngoặc vuông" là đơn giản và hoạt động, nhưng nó bị giới hạn trong PHP và mảng.
Nếu các loại biến khác như lớp hoặc truyền biến trong chuỗi truy vấn bằng ngôn ngữ khác với PHP là bắt buộc, phương thức JSON được khuyến nghị.

Ví dụ trong PHP của phương thức JSON (phương thức 2):

$myarray = array(2, 46, 34, "dfg");
$serialized = json_encode($myarray)
$data = 'myarray=' . rawurlencode($serialized);
// Send to page via cURL, header() or other service.

Mã nhận trang (PHP):

$myarray = json_decode($_GET["myarray"]); // Or $_POST["myarray"] if a post request.

1
Express.js cũng hỗ trợ ký hiệu dấu ngoặc vuông, được thử nghiệm trên 4.13.4.
Steve Kehlet

7

Tôi cảm thấy nó sẽ hữu ích cho ai đó đang tìm cách chuyển mảng trong chuỗi truy vấn đến một servlet. Tôi đã thử nghiệm bên dưới chuỗi truy vấn và có thể nhận được các giá trị mảng bằng cách sử dụng req.getgetParameterValues ​​(); phương pháp. Dưới đây là chuỗi truy vấn tôi chuyển qua trình duyệt.

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

hộp kiểm là mảng tham số của tôi ở đây.


5

Điều này làm việc cho tôi:

Trong liên kết, thuộc tính có giá trị:

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

Tuyến có thể xử lý việc này:

path="/filter/:arr"

Đối với nhiều mảng:

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

Tuyến vẫn như cũ.

MÀN HÌNH

nhập mô tả hình ảnh ở đây


2

Bạn đề cập đến PHP và Javascript trong câu hỏi của bạn, nhưng không phải trong các thẻ. Tôi đã đạt được câu hỏi này với ý định chuyển một mảng sang một hành động MVC.Net.

Tôi tìm thấy câu trả lời cho câu hỏi của tôi ở đây : định dạng dự kiến ​​là định dạng bạn đề xuất trong câu hỏi của mình, với nhiều tham số có cùng tên.


2
Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi.
Andrew

@Andrew Đây không phải là một câu trả lời duy nhất. "Định dạng dự kiến ​​là định dạng bạn đề xuất trong câu hỏi của mình, với nhiều tham số có cùng tên."
DCShannon

2

Tôi sử dụng React và Rails. Tôi đã làm:

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

Bạn có thể sử dụng http_build_query để tạo chuỗi truy vấn được mã hóa URL từ một mảng trong PHP. Trong khi chuỗi truy vấn kết quả sẽ được mở rộng, bạn có thể quyết định một dấu tách duy nhất bạn muốn làm tham số cho http_build_queryphương thức, vì vậy khi giải mã, bạn có thể kiểm tra dấu phân cách nào được sử dụng. Nếu đó là duy nhất bạn chọn, thì đó sẽ là chuỗi truy vấn mảng nếu không nó sẽ là các truy vấn thông thường.


1

Mặc dù không có tiêu chuẩn về phần URL, nhưng có một tiêu chuẩn cho JavaScript. Nếu bạn chuyển các đối tượng chứa mảng sang URLSearchParamsvà gọi toString()nó, nó sẽ chuyển đổi nó thành một danh sách các mục được phân tách bằng dấu phẩy:

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

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

0

Kiểm tra parse_stringchức năng http://php.net/manual/en/feft.parse-str.php

Nó sẽ trả về tất cả các biến từ một chuỗi truy vấn, bao gồm cả mảng.

Ví dụ từ 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

?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.