Bagaimana cara melewatkan array dalam string kueri?

353

Apakah ada cara standar untuk melewatkan array melalui string kueri?

Agar jelas, saya memiliki string kueri dengan beberapa nilai, salah satunya adalah nilai array. Saya ingin agar nilai string kueri diperlakukan sebagai array- Saya tidak ingin array meledak sehingga tidak dapat dibedakan dari variabel string kueri lainnya.

Juga, menurut jawaban posting ini , penulis menyarankan bahwa dukungan string kueri untuk array tidak ditentukan. Apakah ini akurat?

EDIT:

Berdasarkan jawaban @ Alex, tidak ada cara standar untuk melakukan ini, jadi tindak lanjut saya adalah lalu bagaimana cara mudah untuk mengenali bahwa paramater yang saya baca adalah array dalam PHP dan Javascript ?

Apakah bisa diterima untuk menyebutkan beberapa params dengan nama yang sama, dan dengan cara itu saya akan tahu bahwa mereka termasuk dalam array? Contoh:

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

Atau apakah ini praktik yang buruk?

Yarin
sumber
Kerangka apa yang Anda gunakan? Beberapa kerangka kerja memiliki metode untuk membantu meneruskan array ke querystrings.
keyboardP
@ keyboardP- PHP dan Javascript, tergantung pada use case
Yarin
2
Mengapa Anda ingin melakukan itu ketika Anda bisa melakukan:? Myarray = value1, value2, value3
Serodis
18
@seroid: bagaimana jika dia harus memberikan koma, tanda tanya, tanda sama, dan karakter yang tidak dapat dicetak?
Berry Tsakala

Jawaban:

429

Inilah yang saya temukan:

Mengirimkan bidang formulir multi-nilai, yaitu mengirimkan array melalui GET / POST vars, dapat dilakukan beberapa cara yang berbeda, karena standar tidak harus dijabarkan.

Tiga cara yang mungkin untuk mengirim bidang multi-nilai atau array adalah:

  • ?cars[]=Saab&cars[]=Audi (Cara terbaik - PHP membaca ini ke dalam array)
  • ?cars=Saab&cars=Audi (Bad way- PHP hanya akan mendaftarkan nilai terakhir)
  • ?cars=Saab,Audi (Belum mencoba ini)

Formulir Contoh

Pada formulir, bidang multi-nilai bisa berbentuk kotak pilih yang disetel ke beberapa :

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

(CATATAN: Dalam hal ini, penting untuk memberi nama kontrol pilih some_name[], sehingga vars permintaan yang dihasilkan akan didaftarkan sebagai array oleh PHP)

... atau sebagai beberapa bidang tersembunyi dengan nama yang sama :

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

CATATAN: Menggunakan field[]untuk beberapa nilai sangat buruk didokumentasikan. Saya tidak melihat penyebutan itu di bagian kunci multi-nilai dalam string Kueri - Wikipedia , atau dalam dokumen W3C yang berurusan dengan input multi-pilih.


MEMPERBARUI

Seperti yang ditunjukkan oleh komentator, ini sangat spesifik kerangka kerja. Beberapa contoh:

String kueri:

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

Rel:

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

Sudut:

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

( Diskusi sudut )

Lihat komentar untuk contoh di node.js , Wordpress , ASP.net


Mempertahankan pesanan: Satu hal lagi yang perlu dipertimbangkan adalah bahwa jika Anda perlu mempertahankan urutan barang-barang Anda (yaitu array sebagai daftar yang dipesan), Anda benar-benar hanya memiliki satu opsi, yang melewati daftar nilai yang dibatasi, dan secara eksplisit mengubahnya menjadi sebuah array sendiri.

Yarin
sumber
3
Saya pikir alasan bahwa fungsi ini tidak didokumentasikan dalam sumber-sumber umum seperti Wiki atau W3C adalah karena itu umumnya tidak didukung oleh kerangka kerja web. PHP dan saya pikir Rails secara otomatis mengkonversi beberapa parameter kueri "key []" menjadi sebuah array. Yang lain tidak.
Carl G
3
Modul querystring nodejs menggunakan ?cars=Saab&cars=Audiformulir
SystemParadox
53
Dalam express (node.js), keduanya ?cars=Saab&cars=Audidan ?cars[]=Saab&cars[]=Audidiubah menjadi array. Namun, ?cars=Saabberakhir sebagai string, tetapi ?cars[]=Saabmerupakan array dengan elemen tunggal.
Trevor Dixon
5
Bisakah Anda mengatur kunci menggunakan pendekatan ini? Dan bagaimana dengan array multi dimensi?
Qwerty
5
ASP.NET MVC tampaknya tidak membaca format. ?cars[]=Saab&cars[]=AudiTidak boleh ada kurung siku atau kurung siku perlu indeks /
Mr. Flibble
37

String kueri membawa data tekstual sehingga tidak ada pilihan selain meledak array, menyandikannya dengan benar dan meneruskannya dalam format representasional pilihan Anda:

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

dan kemudian mendekode dalam kode sisi server Anda.

Alex K.
sumber
OK terima kasih atas klarifikasi. Bisakah Anda melihat pertanyaan saya yang direvisi - perlukah melakukan p1 ... pn, untuk kunci, atau bisakah saya memberi nama beberapa kunci 'p', dan dengan cara itu saya akan tahu bahwa semuanya milik array yang sama?
Yarin
1
Anda bisa menggunakan nama yang sama; stackoverflow.com/questions/2203430/… atau hanya p = aa, bb, cc yang merupakan cara paling jelas seperti komentar Serodis.
Alex K.
sangat berguna dengan JSON.stringifydan JSON.parse!
charliebrownie
1
Format representasi sederhana dan umum adalah JSON, dalam PHP menggunakan json_encodeitu rawurlencodedan json_decodedi halaman lain.
Edward
20

Saya tidak berpikir ada standar.
Setiap lingkungan web menyediakan 'standar' sendiri untuk hal-hal seperti itu. Selain itu, url biasanya terlalu pendek untuk apa pun (batas 256 byte pada beberapa browser). Tentu saja array / data yang lebih lama dapat dikirim dengan permintaan POST.

Namun, ada beberapa metode:

  1. Ada cara PHP, yang menggunakan tanda kurung siku ( [, ]) di kueri URL. Misalnya kueri seperti ?array_name[]=item&array_name[]=item_2telah dikatakan berfungsi, meskipun tidak didokumentasikan dengan buruk, dengan PHP secara otomatis mengubahnya menjadi sebuah array. Sumber: https://stackoverflow.com/a/9547490/3787376

  2. Format pertukaran data objek (misalnya JSON - situs web resmi , dokumentasi PHP ) juga dapat digunakan jika mereka memiliki metode untuk mengonversi variabel ke dan dari string seperti yang dilakukan JSON.
    Juga url-encoder (tersedia untuk sebagian besar bahasa pemrograman) diperlukan untuk mendapatkan permintaan HTTP untuk menyandikan data string dengan benar.

Meskipun "metode tanda kurung siku" sederhana dan berfungsi, ia terbatas pada PHP dan array.
Jika jenis variabel lain seperti kelas atau variabel lewat dalam string kueri dalam bahasa selain PHP diperlukan, metode JSON disarankan.

Contoh dalam metode PHP JSON (metode 2):

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

Kode untuk halaman penerima (PHP):

$myarray = json_decode($_GET["myarray"]); // Or $_POST["myarray"] if a post request.
Berry Tsakala
sumber
1
Express.js juga mendukung notasi braket persegi, diuji pada 4.13.4.
Steve Kehlet
7

Saya merasa akan sangat membantu bagi seseorang yang mencari untuk melewatkan array dalam string kueri ke servlet. Saya menguji string kueri di bawah ini dan bisa mendapatkan nilai array menggunakan req.getgetParameterValues ​​(); metode. Di bawah ini adalah string kueri yang saya lewati melalui browser.

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

checkbox adalah array parameter saya di sini.

vara
sumber
5

Ini bekerja untuk saya:

Di tautan, ke atribut memiliki nilai:

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

Rute dapat menangani ini:

path="/filter/:arr"

Untuk Banyak array:

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

Rute tetap sama.

SCREENSHOT

masukkan deskripsi gambar di sini

Alia
sumber
2

Anda menyebutkan PHP dan Javascript dalam pertanyaan Anda, tetapi tidak dalam tag. Saya mencapai pertanyaan ini dengan maksud meneruskan array ke tindakan MVC.Net.

Saya menemukan jawaban untuk pertanyaan saya di sini : format yang diharapkan adalah yang Anda usulkan dalam pertanyaan Anda, dengan beberapa parameter memiliki nama yang sama.

DCShannon
sumber
2
Meskipun tautan ini dapat menjawab pertanyaan, lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini dan memberikan tautan untuk referensi. Jawaban hanya tautan dapat menjadi tidak valid jika halaman tertaut berubah.
Andrew
@Andrew Ini bukan jawaban hanya tautan. "Format yang diharapkan adalah yang Anda usulkan dalam pertanyaan Anda, dengan beberapa parameter memiliki nama yang sama."
DCShannon
2

Saya menggunakan Bereaksi dan Rel. Aku melakukannya:

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
Linielson
sumber
1

Anda dapat menggunakan http_build_query untuk menghasilkan querystring yang disandikan URL dari sebuah array di PHP. Sementara querystring yang dihasilkan akan diperluas, Anda dapat memutuskan pemisah unik yang Anda inginkan sebagai parameter untuk http_build_querymetode ini, jadi ketika datang ke decoding, Anda dapat memeriksa pemisah apa yang digunakan. Jika itu yang unik yang Anda pilih, maka itu akan menjadi querystring array kalau tidak itu akan menjadi querystrings normal.

keyboardP
sumber
1

Meskipun tidak ada standar pada bagian URL, ada satu standar untuk JavaScript. Jika Anda mengirimkan objek yang berisi array ke URLSearchParams, dan memanggilnya toString(), itu akan mengubahnya menjadi daftar item yang dipisahkan koma:

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

new URLSearchParams(data).toString();  # ?str=abc&arr=abc,123
João Haas
sumber
0

Periksa parse_stringfungsi http://php.net/manual/en/function.parse-str.php

Ini akan mengembalikan semua variabel dari string kueri, termasuk array.

Contoh dari 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

?>
Dan Murfitt
sumber