จะส่งผ่านอาร์เรย์ภายในสตริงการสืบค้นได้อย่างไร


355

มีวิธีมาตรฐานในการส่งผ่านอาร์เรย์ผ่านสายอักขระแบบสอบถามหรือไม่

เพื่อความชัดเจนฉันมีสตริงแบบสอบถามที่มีหลายค่าซึ่งหนึ่งในนั้นจะเป็นค่าอาร์เรย์ ฉันต้องการให้ค่าสตริงข้อความค้นหานั้นถือว่าเป็นอาร์เรย์ฉันไม่ต้องการให้อาร์เรย์ถูกระเบิดเพื่อให้แยกไม่ออกจากตัวแปรสตริงแบบสอบถามอื่น ๆ

นอกจากนี้ตามคำตอบโพสต์นี้ผู้เขียนแนะนำว่าไม่สนับสนุนการสืบค้นสตริงสำหรับอาร์เรย์ ถูกต้องหรือไม่

แก้ไข:

จากคำตอบของ @ Alex ไม่มีวิธีมาตรฐานในการทำเช่นนี้ดังนั้นการติดตามของฉันจึงเป็นวิธีที่ง่ายในการรับรู้ว่าพารามิเตอร์ที่ฉันกำลังอ่านคืออาร์เรย์ทั้งในPHPและJavascript ?

มันจะเป็นที่ยอมรับในการตั้งชื่อหลาย params ในชื่อเดียวกันและวิธีที่ฉันจะรู้ว่าพวกเขาอยู่ในอาร์เรย์? ตัวอย่าง:

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

หรือนี่จะเป็นการปฏิบัติที่ไม่ดี?


คุณใช้กรอบอะไร เฟรมเวิร์กบางตัวมีวิธีการที่ช่วยส่งผ่านอาร์เรย์ไปยังการสอบถาม
keyboardP

@ keyboardP- PHP และ Javascript ขึ้นอยู่กับกรณีการใช้งาน
Yarin

2
ทำไมคุณต้องการทำเช่นนั้นเมื่อคุณสามารถทำได้:? myarray = value1, value2, value3
Serodis

18
@seroids: ถ้าเขาต้องผ่านเครื่องหมายจุลภาคเครื่องหมายคำถามเครื่องหมายเท่ากับและอักขระที่พิมพ์ไม่ได้
Berry Tsakala

คำตอบ:


431

นี่คือสิ่งที่ฉันคิดออก:

การส่งฟิลด์ฟอร์มที่มีหลายค่าเช่นการส่งอาร์เรย์ผ่าน GET / POST สามารถทำได้หลายวิธีเนื่องจากมาตรฐานไม่จำเป็นต้องสะกดออกมา

วิธีที่เป็นไปได้สามวิธีในการส่งเขตข้อมูลหรืออาร์เรย์หลายค่าคือ:

  • ?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>

(หมายเหตุ: ในกรณีนี้มันเป็นสิ่งสำคัญที่จะตั้งชื่อตัวควบคุมที่เลือกsome_name[]เพื่อให้ vars คำขอที่เป็นผลลัพธ์จะถูกลงทะเบียนเป็นอาร์เรย์โดย PHP)

... หรือฟิลด์ที่ซ่อนอยู่หลายรายการที่มีชื่อเดียวกัน :

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

หมายเหตุ:การใช้field[]สำหรับค่าหลายค่ามีการจัดทำเอกสารไม่ดีจริง ๆ ฉันไม่เห็นการกล่าวถึงในส่วนของคีย์ที่มีค่าหลายค่าในสตริงการสืบค้น - Wikipediaหรือในเอกสาร W3C ที่เกี่ยวข้องกับอินพุตแบบเลือกได้หลายแบบ


UPDATE

ในฐานะที่เป็นผู้แสดงความคิดเห็นได้ชี้ให้เห็นว่านี่เป็นกรอบเฉพาะมาก ตัวอย่างบางส่วน:

สตริงข้อความค้นหา:

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

Rails:

"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


การรักษาลำดับ: อีกสิ่งหนึ่งที่ควรพิจารณาคือถ้าคุณต้องการรักษาลำดับของรายการของคุณ (เช่นอาร์เรย์เป็นรายการที่สั่งซื้อ) คุณจะมีตัวเลือกเพียงตัวเดียวเท่านั้นซึ่งจะส่งรายการค่าที่คั่นและแปลงเป็น อาร์เรย์ด้วยตัวคุณเอง


3
ฉันคิดว่าเหตุผลที่ฟังก์ชั่นนี้ไม่ได้รับการบันทึกไว้ในแหล่งข้อมูลทั่วไปเช่น Wiki หรือ W3C ก็คือว่ามันไม่ได้รับการสนับสนุนโดยกรอบเว็บทั่วไป PHP และฉันคิดว่า Rails แปลงพารามิเตอร์การสืบค้น "คีย์ []" หลายรายการโดยอัตโนมัติเป็นอาร์เรย์ คนอื่นทำไม่ได้
Carl G

3
โมดูล querystring ของ nodejs ใช้?cars=Saab&cars=Audiแบบฟอร์ม
SystemParadox

53
ใน express (node.js) ทั้งสอง?cars=Saab&cars=Audiและ?cars[]=Saab&cars[]=Audiรับกลายเป็นอาร์เรย์ อย่างไรก็ตาม?cars=Saabจบลงด้วยการเป็นสตริง แต่?cars[]=Saabเป็นอาร์เรย์ที่มีองค์ประกอบเดียว
เทรเวอร์ดิกซัน

5
คุณสามารถตั้งค่าคีย์โดยใช้วิธีนี้ได้หรือไม่? แล้วอาร์เรย์แบบหลายมิติล่ะ?
Qwerty

5
ASP.NET MVC ดูเหมือนจะไม่อ่านรูปแบบ?cars[]=Saab&cars[]=Audiมีทั้งไม่มีวงเล็บเหลี่ยมหรือวงเล็บเหลี่ยมต้องการดัชนี /
นาย Flibble

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

1
รูปแบบการดำเนินการที่ง่ายและเป็นรูปแบบทั่วไปคือ JSON ใน PHP ที่ใช้งานjson_encodeแล้วrawurlencodeและjson_decodeในหน้าอื่น ๆ
Edward

20

ฉันไม่คิดว่าจะมีมาตรฐาน
สภาพแวดล้อมของเว็บแต่ละแห่งมี 'มาตรฐาน' สำหรับสิ่งต่าง ๆ นอกจากนี้ URL มักสั้นเกินไปสำหรับทุกสิ่ง (จำกัด ขนาด 256 ไบต์ในบางเบราว์เซอร์) แน่นอนว่าอาร์เรย์ / ข้อมูลที่ยาวขึ้นสามารถส่งด้วยคำขอ POST

อย่างไรก็ตามมีวิธีการบางอย่าง:

  1. มีวิธี PHP ซึ่งใช้วงเล็บเหลี่ยม ( [, ]) ในการค้นหา URL ตัวอย่างเช่น?array_name[]=item&array_name[]=item_2มีการพูดว่าแบบสอบถามทำงานแม้ว่าจะมีการจัดทำเอกสารไม่ดีโดย PHP จะทำการแปลงให้เป็นอาร์เรย์โดยอัตโนมัติ ที่มา: https://stackoverflow.com/a/9547490/3787376

  2. รูปแบบการแลกเปลี่ยนข้อมูลวัตถุ (เช่น JSON - เว็บไซต์อย่างเป็นทางการ , เอกสาร PHP ) สามารถใช้หากพวกเขามีวิธีการแปลงตัวแปรไปและกลับจากสตริงเช่นเดียวกับ JSON
    นอกจากนี้ยังจำเป็นต้องใช้ url-encoder (มีให้สำหรับภาษาการเขียนโปรแกรมส่วนใหญ่) สำหรับ HTTP รับคำร้องขอเพื่อเข้ารหัสข้อมูลสตริงอย่างถูกต้อง

ถึงแม้ว่า "วิธีการวงเล็บเหลี่ยม" เป็นเรื่องง่ายและใช้งานได้จะถูก จำกัด 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
Steve Kehlet

7

ฉันรู้สึกว่ามันจะเป็นประโยชน์สำหรับคนที่กำลังมองหาผ่านอาร์เรย์ในสตริงแบบสอบถามไปยัง servlet ฉันทดสอบสตริงการสืบค้นด้านล่างและสามารถรับค่าอาร์เรย์โดยใช้ req.getgetParameterValues ​​(); วิธี. ด้านล่างเป็นสตริงข้อความค้นหาที่ฉันส่งผ่านเบราว์เซอร์

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

ช่องทำเครื่องหมายเป็นอาร์เรย์พารามิเตอร์ของฉันที่นี่


5

สิ่งนี้ใช้ได้กับฉัน:

ในลิงค์ไปยังแอตทริบิวต์มีค่า:

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

เส้นทางสามารถจัดการสิ่งนี้:

path="/filter/:arr"

สำหรับหลายอาร์เรย์:

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

เส้นทางยังคงเหมือนเดิม

SCREENSHOT

ป้อนคำอธิบายรูปภาพที่นี่


2

คุณพูดถึง PHP และ Javascript ในคำถามของคุณ แต่ไม่ใช่ในแท็ก ฉันมาถึงคำถามนี้ด้วยความตั้งใจที่จะส่งอาร์เรย์ไปยังการกระทำ MVC.Net

ฉันพบคำตอบสำหรับคำถามของฉันที่นี่ : รูปแบบที่คาดหวังคือรูปแบบที่คุณเสนอในคำถามของคุณโดยมีพารามิเตอร์หลายตัวที่มีชื่อเหมือนกัน


2
แม้ว่าลิงก์นี้อาจตอบคำถามได้ดีกว่าหากรวมส่วนสำคัญของคำตอบไว้ที่นี่และให้ลิงก์สำหรับการอ้างอิง คำตอบสำหรับลิงค์เท่านั้นอาจไม่ถูกต้องหากหน้าเว็บที่เชื่อมโยงมีการเปลี่ยนแปลง
Andrew

@Andrew มันไม่ใช่แค่คำตอบสำหรับลิงค์เท่านั้น "รูปแบบที่คาดหวังเป็นรูปแบบที่คุณเสนอในคำถามของคุณโดยมีพารามิเตอร์หลายตัวที่มีชื่อเหมือนกัน"
DCShannon

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เพื่อสร้างการสืบค้น URL ที่เข้ารหัสจากอาร์เรย์ใน PHP ในขณะที่การสืบค้นผลที่ได้จะถูกขยายออกไปคุณสามารถเลือกตัวคั่นเฉพาะที่คุณต้องการใช้เป็นพารามิเตอร์ของ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/en/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

?>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.