क्वेरी स्ट्रिंग के भीतर एक सरणी कैसे पास करें?


355

क्या क्वेरी स्ट्रिंग के माध्यम से किसी सरणी को पास करने का एक मानक तरीका है?

स्पष्ट होने के लिए, मेरे पास कई मानों के साथ एक क्वेरी स्ट्रिंग है, जिनमें से एक सरणी मान होगा। मैं चाहता हूं कि क्वेरी स्ट्रिंग मान को एक सरणी के रूप में माना जाए- मैं नहीं चाहता कि सरणी को विस्फोट किया जाए ताकि यह अन्य क्वेरी स्ट्रिंग चर से अप्रभेद्य हो।

इसके अलावा, इस पोस्ट उत्तर के अनुसार , लेखक का सुझाव है कि सरणियों के लिए क्वेरी स्ट्रिंग समर्थन को परिभाषित नहीं किया गया है। क्या यह सही है?

संपादित करें:

पर @ एलेक्स के जवाब के आधार पर, वहाँ ऐसा करने का कोई मानक तरीका, इसलिए मेरे अनुवर्ती अप तो क्या एक आसान तरीका करने के लिए है पहचान है कि परमाटर मैं पढ़ रहा हूँ दोनों में एक सरणी है पीएचपी और जावास्क्रिप्ट ?

क्या एक ही नाम के लिए कई नाम रखना स्वीकार्य होगा, और इस तरह मुझे पता होगा कि वे एक सरणी से संबंधित हैं? उदाहरण:

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

या यह बुरा अभ्यास होगा?


आप किस फ्रेमवर्क का उपयोग कर रहे हैं? कुछ चौखटे में तरीके हैं जो एरियर्स को पास करने में मदद करते हैं।
कीबोर्ड

@ कीबोर्डपी- PHP और जावास्क्रिप्ट, उपयोग के मामले पर निर्भर करता है
यारिन

2
आप ऐसा क्यों करना चाहेंगे, जब आप बस कर सकते हैं: myarray = value1, value2,
value3

18
@ टिप्पणी: क्या होगा यदि उसे अल्पविराम, प्रश्न चिह्न, समान चिह्न और गैर-मुद्रण योग्य वर्ण पास करने हों?
बेरी त्सकला

जवाबों:


431

यहाँ मैं क्या पता लगा है:

बहु-मूल्य प्रपत्र फ़ील्ड सबमिट करना, अर्थात GET / POST var के माध्यम से सरणियाँ प्रस्तुत करना, कई अलग-अलग तरीकों से किया जा सकता है, क्योंकि एक मानक जरूरी नहीं है।

बहु-मूल्य फ़ील्ड या सरणियाँ भेजने के तीन संभावित तरीके होंगे:

  • ?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[], ताकि परिणामी अनुरोध चर PHP द्वारा एक सरणी के रूप में पंजीकृत होंगे)

... या एक ही नाम के साथ कई छिपे हुए फ़ील्ड :

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

नोट:field[] कई मानों का उपयोग करना वास्तव में खराब दस्तावेज है। मुझे क्वेरी स्ट्रिंग - विकिपीडिया , या बहु-चयन इनपुट से निपटने वाले W3C डॉक्स में बहु-मूल्यवान कुंजियों पर अनुभाग में इसका कोई उल्लेख नहीं दिखता है।


अपडेट करें

जैसा कि टिप्पणीकारों ने बताया है, यह बहुत अधिक विशिष्ट है। कुछ उदाहरण:

क्वेरी स्ट्रिंग:

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

(कोणीय चर्चा )

नोड.जेएस , वर्डप्रेस , ASP.net में उदाहरणों के लिए टिप्पणियां देखें


ऑर्डर बनाए रखना: विचार करने के लिए एक और बात यह है कि यदि आपको अपने आइटम के ऑर्डर को बनाए रखने की आवश्यकता है (यानी एक ऑर्डर की गई सूची के रूप में सरणी), तो आपके पास वास्तव में केवल एक विकल्प है, जो मानों की सीमांकित सूची से गुजर रहा है, और स्पष्ट रूप से इसे परिवर्तित करना अपने आप को एक सरणी।


3
मुझे लगता है कि यह कार्यशीलता विकी या डब्लू 3 सी जैसे सामान्य स्रोतों में प्रलेखित नहीं है, यह आमतौर पर वेब फ्रेमवर्क द्वारा समर्थित नहीं है। PHP और मुझे लगता है कि रेल स्वचालित रूप से एक सरणी में कई "कुंजी []" क्वेरी मापदंडों को परिवर्तित करती है। दूसरों को नहीं।
कार्ल जी

3
नोडज क्वेरिस्ट्रिंग मॉड्यूल ?cars=Saab&cars=Audiफॉर्म का उपयोग करता है
SystemParadox

53
एक्सप्रेस (नोड.जेएस) में, दोनों ?cars=Saab&cars=Audiऔर ?cars[]=Saab&cars[]=Audiसरणियों में बदल जाते हैं। हालांकि, ?cars=Saabएक स्ट्रिंग के रूप में समाप्त होता है, लेकिन ?cars[]=Saabएक तत्व के साथ एक सरणी है।
ट्रेवर डिक्सन

5
क्या आप इस दृष्टिकोण का उपयोग करके चाबियाँ सेट कर सकते हैं? और बहुआयामी सरणियों के बारे में क्या?
क्वर्टी

5
ASP.NET MVC प्रारूप को पढ़ने के लिए प्रकट नहीं होता ?cars[]=Saab&cars[]=Audiहै या तो कोई वर्ग ब्रैकेट नहीं होते हैं या वर्ग कोष्ठक को अनुक्रमित की आवश्यकता होती है /
श्री फ़्लिबल

37

एक क्वेरी स्ट्रिंग टेक्स्ट डेटा को ले जाती है, इसलिए एरे को विस्फोट करने के अलावा कोई विकल्प नहीं है, इसे सही तरीके से एनकोड करें और इसे अपनी पसंद के अभ्यावेदन प्रारूप में पास करें:

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

और फिर इसे अपने सर्वर साइड कोड में डिकोड करें।


स्पष्टीकरण के लिए ठीक है धन्यवाद। क्या आप मेरा संशोधित प्रश्न देख सकते हैं- क्या यह p1 ... pn, कुंजियों के लिए करना आवश्यक है, या क्या मैं कई कुंजियों का नाम 'p' रख सकता हूं, और इस तरह से मुझे पता चल जाएगा कि वे सभी एक ही सरणी से संबंधित हैं?
यारिन

1
आप एक ही नाम का उपयोग कर सकते हैं; stackoverflow.com/questions/2203430/… या सिर्फ p = aa, bb, cc जो कि सबसे स्पष्ट तरीका है जैसा कि सेरोडिस ने टिप्पणी की थी।
एलेक्स के।

साथ बहुत उपयोगी है JSON.stringifyऔर JSON.parse!
चार्लीब्रोनी

1
एक सरल और सामान्य अभ्यावेदन प्रारूप है JSON का, PHP में json_encodeतब rawurlencodeऔर json_decodeदूसरे पेज पर।
एडवर्ड

20

मुझे नहीं लगता कि कोई मानक है।
प्रत्येक वेब वातावरण ऐसी चीजों के लिए अपना स्वयं का 'मानक' प्रदान करता है। इसके अलावा, यूआरएल आमतौर पर कुछ के लिए बहुत कम है (कुछ ब्राउज़रों पर 256 बाइट्स सीमा)। बेशक अब सरणियाँ / डेटा POST अनुरोधों के साथ भेजे जा सकते हैं।

हालाँकि, कुछ विधियाँ हैं:

  1. URL प्रश्नों में स्क्वायर ब्रैकेट ( [, ]) का उपयोग करने वाला एक PHP तरीका है । उदाहरण के लिए एक क्वेरी जैसे ?array_name[]=item&array_name[]=item_2कि काम के लिए कहा गया है, खराब रूप से प्रलेखित होने के बावजूद, PHP स्वचालित रूप से इसे एक सरणी में परिवर्तित करता है। स्रोत: https://stackoverflow.com/a/9547490/3787376

  2. ऑब्जेक्ट डेटा-इंटरचेंज फॉर्मेट (जैसे JSON - आधिकारिक वेबसाइट , PHP डॉक्यूमेंटेशन ) का भी उपयोग किया जा सकता है, अगर उनके पास वेरिएबल को JSON के रूप में और स्ट्रिंग से परिवर्तित करने के तरीके हैं।
    इसके अलावा एक url- एनकोडर (अधिकांश प्रोग्रामिंग भाषाओं के लिए उपलब्ध) के लिए आवश्यक है HTTP से स्ट्रिंग डेटा को सही ढंग से एनकोड करने के लिए अनुरोध प्राप्त करें।

यद्यपि "स्क्वायर ब्रैकेट विधि" सरल और काम करती है, यह PHP और सरणियों तक सीमित है।
यदि PHP के अलावा किसी अन्य प्रकार के चर जैसे किसी भाषा में क्वेरी स्ट्रिंग्स के भीतर कक्षाएं या पासिंग वैरिएबल की आवश्यकता होती है, तो JSON विधि की सिफारिश की जाती है।

JSON विधि (विधि 2) के PHP में उदाहरण:

$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 पर परीक्षण किया गया।
स्टीव केहलेट

7

मुझे लगता है कि यह किसी ऐसे व्यक्ति के लिए मददगार होगा जो किसी क्वेरी स्ट्रिंग में सरणी को पास करने की तलाश में है। मैंने क्वेरी स्ट्रिंग के नीचे परीक्षण किया और 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 और जावास्क्रिप्ट का उल्लेख करते हैं, लेकिन टैग में नहीं। मैं इस प्रश्न को एक एमवीसी.नेट कार्रवाई के लिए एक सरणी पास करने के इरादे से पहुंचा।

मुझे अपने प्रश्न का उत्तर यहाँ मिला : अपेक्षित प्रारूप वही है जो आपने अपने प्रश्न में प्रस्तावित किया है, जिसमें एक ही नाम के कई पैरामीटर हैं।


2
हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं।
एंड्रयू

@ और यह केवल एक लिंक नहीं है उत्तर। "अपेक्षित प्रारूप वही है जो आपने अपने प्रश्न में प्रस्तावित किया है, जिसमें एक ही नाम के कई पैरामीटर हैं।"
डीसीशोनॉन

2

मैं रिएक्ट और रेल का उपयोग करता हूं। मैंने किया:

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

PHP में एक सरणी से URL-एन्कोडेड querystring उत्पन्न करने के लिए आप http_build_query का उपयोग कर सकते हैं । जिसके परिणामस्वरूप परिणामी क्लेरिस्ट्रिंग का विस्तार किया जाएगा, आप एक अद्वितीय विभाजक पर निर्णय ले सकते हैं जिसे आप http_build_queryविधि के पैरामीटर के रूप में चाहते हैं , इसलिए जब यह डिकोडिंग की बात आती है, तो आप जांच सकते हैं कि विभाजक का उपयोग क्या किया गया था। यदि यह अद्वितीय था जिसे आपने चुना था, तो वह सरणी querystring होगी अन्यथा यह सामान्य querystrings होगा।


1

यद्यपि URL भाग पर कोई मानक नहीं है, लेकिन जावास्क्रिप्ट के लिए एक मानक है। यदि आप सरणियों वाली वस्तुओं को पास करते हैं 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

?>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.