Url पैरामीटर के रूप में सरणियों को पास करना


115

सबसे अच्छा तरीका क्या है कि मैं एक सरणी को यूआरएल पैरामीटर के रूप में पारित कर सकता हूं? मैं सोच रहा था कि क्या यह संभव है:

$aValues = array();

$url = 'http://www.example.com?aParam='.$aValues;

या इसके बारे में कैसे:

$url = 'http://www.example.com?aParam[]='.$aValues;

Ive उदाहरण पढ़ें, लेकिन मुझे यह गन्दा लगता है:

$url = 'http://www.example.com?aParam[]=value1&aParam[]=value2&aParam[]=value3';

2
आप सिर्फ पास क्यों नहीं कर सकते $_POST?
रैंडम

यह वास्तव में गड़बड़ लग रहा है। लेकिन उस दृष्टिकोण के लिए यह होना चाहिए। अन्य दृष्टिकोण, थोड़ा जटिल असाइन करना है query = array('aParam'=> json_encode($arrayOfValues))। और आप के साथ अच्छे यूआरएल में पारित कर सकते हैं url_encode(implode('/',$query))। Url जैसा दिखेगा www.example.com/aParam/[va1,val2,...]। जब आप प्राप्त करने के लिए json_decode aaram में सरणी में है।
व्लादिमीर वुकानैक

जवाबों:


220

एक बहुत ही सरल उपाय है http_build_query():। यह आपके क्वेरी मापदंडों को एक सहयोगी सरणी के रूप में लेता है:

$data = array(
    1,
    4,
    'a' => 'b',
    'c' => 'd'
);
$query = http_build_query(array('aParam' => $data));

वापस होगा

string(63) "aParam%5B0%5D=1&aParam%5B1%5D=4&aParam%5Ba%5D=b&aParam%5Bc%5D=d"

http_build_query()आप ( %5B=> [और %5D=> ]) के लिए सभी आवश्यक भागने को संभालता है , इसलिए यह स्ट्रिंग के बराबर है aParam[0]=1&aParam[1]=4&aParam[a]=b&aParam[c]=d


16
यदि आप सोच रहे हैं कि इसे वापस सरणी में कैसे लाया जाए, तो इसका उत्तर है parse_str ()
टाइपो

1
मैंने इसका उपयोग url को सरणी में रखने के लिए किया है, लेकिन डेटा वापस पाने का तरीका नहीं जानता। मैंने parse_str की कोशिश की और इसे काम करने के लिए नहीं मिला। मुझे लगता है कि यह बहुमूल्य जानकारी होगी
थॉमस विलियम्स

2
किसी के लिए http_build_queryलौटने param[]और somtimes के साथ मुद्दों में चल रहा है param[index]। : इस पोस्ट की जाँच करें stackoverflow.com/questions/11996573/...
stwhite

2
मूल्य वापस पाने के लिए आपको केवल $ $ = $ _GET ['aParam'];
दुरंतुन

@dfortun वापस लेना महत्वपूर्ण है आपने बहुत समय बचाया है parse_str () मेरे लिए काम नहीं किया लेकिन $ डेटा = $ _GET ['aParam']; सही समाधान है
आशे जॉर्ज

56

संपादित करें: ऊपर दिए गए स्टीफन के समाधान को याद न करें , जो बहुत ही उपयोगी http_build_query()फ़ंक्शन का उपयोग करता है : https://stackoverflow.com/a/1764199/179125

बचने के बारे में knittl सही है। हालाँकि, ऐसा करने का एक सरल तरीका है:

$url = 'http://example.com/index.php?';
$url .= 'aValues[]=' . implode('&aValues[]=', array_map('urlencode', $aValues));

यदि आप इसे एक सहयोगी सरणी के साथ करना चाहते हैं, तो इसके बजाय यह प्रयास करें:

PHP 5.3+ (लैम्बडा फ़ंक्शन)

$url = 'http://example.com/index.php?';
$url .= implode('&', array_map(function($key, $val) {
    return 'aValues[' . urlencode($key) . ']=' . urlencode($val);
  },
  array_keys($aValues), $aValues)
);

PHP <5.3 (कॉलबैक)

function urlify($key, $val) {
  return 'aValues[' . urlencode($key) . ']=' . urlencode($val);
}

$url = 'http://example.com/index.php?';
$url .= implode('&amp;', array_map('urlify', array_keys($aValues), $aValues));

1
साफ! अच्छा होगा अगर यह साहचर्य सरणियों के साथ भी काम कर सके। वैसे भी +1
knittl

3
knittl: हम array_map पर कॉलबैक फ़ंक्शन के साथ और कुंजियों और मानों को अलग-अलग पारित करने के साथ कर सकते हैं। इसकी जांच - पड़ताल करें।
जॉर्डन

लेकिन यह अभी भी GET पैरामीटर के अधिकतम आकार को पार कर सकता है? यदि नीचे दिए गए नैश की तरह मैं सत्रों का उपयोग करता हूं तो ऑड्स क्या हैं?
उजी

ठीक है, आप एक सत्र में अधिक या कम असीमित मात्रा में डेटा स्टोर कर सकते हैं। सत्र समाप्त होने के साथ सत्र का जोखिम URL में होता है, या यदि उपयोगकर्ता एक साथ दो टैब में चीजें करने की कोशिश करता है। यदि उपयोगकर्ता पृष्ठ को बुकमार्क करता है, तो उनका सत्र समाप्त होने के बाद वापस आता है, तो क्या वे अभी भी वह पृष्ठ प्राप्त करेंगे जिसकी उन्हें उम्मीद है? ऐसा लगता है कि आपको अपनी वास्तुकला के बारे में अधिक सोचने की आवश्यकता हो सकती है और आप पहली बार में इस तरह के विशाल सरणियों से क्यों गुजर रहे हैं।
जॉर्डन

इस उत्तर को पोस्ट करने के एक साल बाद भी +1 अच्छा जवाब और मेरे लिए काम करना।
नवेद

10

सबसे आसान तरीका serializeफ़ंक्शन का उपयोग करना होगा ।

यह भंडारण या स्थानांतरण के लिए किसी भी चर को क्रमबद्ध करता है। आप इसके बारे में php मैनुअल में पढ़ सकते हैं - क्रमबद्ध करें

चर का उपयोग करके बहाल किया जा सकता है unserialize

इसलिए आपके द्वारा उपयोग किए जाने वाले URL के पास होने में:

$url = urlencode(serialize($array))

और आपके द्वारा उपयोग किए जाने वाले चर को पुनर्स्थापित करने के लिए

$var = unserialize(urldecode($_GET['array']))

हालांकि यहां सावधान रहें। GET अनुरोध का अधिकतम आकार 4k तक सीमित है, जिसे आप आसानी से URL में पासिंग ऐरे से पार कर सकते हैं।

इसके अलावा, यह वास्तव में डेटा पारित करने के लिए सबसे सुरक्षित तरीका नहीं है! आपको शायद इसके बजाय सत्र का उपयोग करना चाहिए।


सीरियलाइज़ करना भी इसे करने का एक अच्छा तरीका है, लेकिन तब यह अब तक नहीं पढ़ा जा सकने वाला रूप है
knittl

1
हाँ, सीरियलाइज़ करना वास्तव में चीजों को करने का एक साफ तरीका नहीं है जब आप उरल्स के साथ काम कर रहे होते हैं, क्योंकि यह डेटा को इतना बढ़ा देता है। कस्टम जाने के लिए बेहतर है।
काज़कई

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

4
आपको वास्तव में अविश्वासित () के लिए अविश्वसनीय डेटा पास नहीं करना चाहिए। इसके बजाय json_encode () और json_decode () आज़माएँ।
मिकको रेंटालिनेन

6

कृपया अपने चर से बच जब उत्पादन ( urlencode)।

और आप सिर्फ एक सरणी नहीं प्रिंट कर सकते हैं, आपको किसी तरह से लूप का उपयोग करके अपने यूआरएल का निर्माण करना होगा

$url = 'http://example.com/index.php?'
$first = true;
foreach($aValues as $key => $value) {
  if(!$first) $url .= '&amp';
  else $first = false;
  $url .= 'aValues['.urlencode($key).']='.urlencode($value);
}

1
प्रथम & amp; "छोड़ें" चर का उपयोग करने के बजाय, आप अपने मूल्यों को संग्रहीत करने के लिए एक अस्थायी सरणी का उपयोग कर सकते हैं, और पासवर्ड का उपयोग कर सकते हैं। सिर्फ पठनीयता के लिए। php.net/implode
nash

5
 <?php
$array["a"] = "Thusitha";
$array["b"] = "Sumanadasa";
$array["c"] = "Lakmal";
$array["d"] = "Nanayakkara";

$str = serialize($array);
$strenc = urlencode($str);
print $str . "\n";
print $strenc . "\n";
?> 

print $str . "\n"; देता है a:4:{s:1:"a";s:8:"Thusitha";s:1:"b";s:10:"Sumanadasa";s:1:"c";s:6:"Lakmal";s:1:"d";s:11:"Nanayakkara";} और

print $strenc . "\n"; देता है

a%3A4%3A%7Bs%3A1%3A%22a%22%3Bs%3A8%3A%22Thusitha%22%3Bs%3A1%3A%22b%22%3Bs%3A10%3A%22Sumanadasa%22%3Bs%3A1%3A%22c%22%3Bs%3A6%3A%22Lakmal%22%3Bs%3A1%3A%22d%22%3Bs%3A11%3A%22Nanayakkara%22%3B%7D

इसलिए यदि आप इसे $arrayURL से गुजरना चाहते हैं page_no_2.php,

उदाहरण के लिए: -

$url ='http://page_no_2.php?data=".$strenc."';

मूल सरणी पर वापस लौटने के लिए, इसे urldecode()तब होना चाहिए unserialize(), जैसे कि page_no_2.php में:

    <?php
    $strenc2= $_GET['data'];
    $arr = unserialize(urldecode($strenc2));
    var_dump($arr);
    ?>

देता है

 array(4) {
  ["a"]=>
  string(8) "Thusitha"
  ["b"]=>
  string(10) "Sumanadasa"
  ["c"]=>
  string(6) "Lakmal"
  ["d"]=>
  string(11) "Nanayakkara"
}

फिर से: डी


3

मैं यह क्रमबद्ध डेटा बेस 64 एनकोडेड के साथ करता हूं। सबसे अच्छा और सबसे छोटा तरीका, मुझे लगता है। urlencode ज्यादा बर्बाद करने वाला स्थान है और आपके पास केवल 4k है।


1

यह एक सीधा जवाब नहीं है क्योंकि यह पहले ही उत्तर दिया जा चुका है, लेकिन हर कोई डेटा भेजने के बारे में बात कर रहा था, लेकिन किसी ने भी वास्तव में नहीं कहा कि आप वहां पहुंचने पर क्या करते हैं, और इसे काम करने में मुझे अच्छा आधा घंटा लगा। इसलिए मैंने सोचा कि मैं यहां मदद करूंगा।

मैं इसे थोड़ा दोहराऊंगा

$data = array(
'cat' => 'moggy',
'dog' => 'mutt'
);
$query = http_build_query(array('mydata' => $data));
$query=urlencode($query);

जाहिर है आप इसे इस www.someurl.com?x=$query से बेहतर स्वरूप देंगे

और डेटा वापस पाने के लिए

parse_str($_GET['x']);
echo $mydata['dog'];
echo $mydata['cat'];

0
**in create url page**

$data = array(
        'car' => 'Suzuki',
        'Model' => '1976'
        );
$query = http_build_query(array('myArray' => $data));
$url=urlencode($query); 

echo" <p><a href=\"index2.php?data=".$url."\"> Send </a><br /> </p>";

**in received page**

parse_str($_GET['data']);
echo $myArray['car'];
echo '<br/>';
echo $myArray['model'];

0

प्राप्त पृष्ठ में आप उपयोग कर सकते हैं:

parse_str ($ str, $ array); var_dump ($ सरणी);


ढेर अतिप्रवाह में आपका स्वागत है। आठ अन्य उत्तरों के साथ दस साल पुराने प्रश्न का उत्तर जोड़ते समय यह बताना बहुत महत्वपूर्ण है कि आपके उत्तर के प्रश्न का नया पहलू क्या है। अभी ऐसा लग रहा है कि आपके पास एक कोड केवल उत्तर है जो पहले से ही अन्य उत्तरों में से एक द्वारा कवर किया गया है। कृपया भविष्य के उत्तरों में कोड के लिए कोड फ़ॉर्मेटिंग का उपयोग करें।
जेसन एलर

0

यह इस समस्या को हल करने का एक और तरीका है।

$data = array(
              1,
              4,
             'a' => 'b',
             'c' => 'd'
              );
$query = http_build_query(array('aParam' => $data));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.