Url প্যারামিটার হিসাবে অ্যারে পাস করা Pass


115

ইউআরএল প্যারামিটার হিসাবে কোনও অ্যারে পাস করার সবচেয়ে ভাল উপায় কী? আমি যদি ভাবছিলাম যে এটি সম্ভব হয়:

$aValues = array();

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

বা এটি সম্পর্কে:

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

আমি উদাহরণগুলি পড়েছি তবে এটি আমার কাছে অগোছালো মনে হচ্ছে:

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

2
আপনি শুধু প্রবেশ করতে পারবেন না কেন $_POST?
এলোমেলোভাবে

এটা সত্যিই অগোছালো দেখাচ্ছে। তবে সেই পদ্ধতির জন্য এটি হওয়া দরকার। অন্যান্য পদ্ধতির, সামান্য জটিল হ'ল নির্ধারণ করা query = array('aParam'=> json_encode($arrayOfValues))। এবং যে আপনি সাথে ভাল ইউআরএল পাস করতে পারেন url_encode(implode('/',$query))। ইউরাল দেখতে পাবেন www.example.com/aParam/[va1,val2,...]। গ্রহণ করার সময় আপনাকে jp__decode এপ্রাম মানটি অ্যারেতে করতে হবে।
ভ্লাদিমির ভুকানাক

উত্তর:


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
আপনি যদি ভাবছেন যে কীভাবে এটি আবার অ্যারেতে পাবেন তবে উত্তরটি পার্স_স্ট্রেল ()
টাইপ করুন

1
আমি এটি ইউআরএল অ্যারেতে লাগাতে ব্যবহার করেছি তবে কীভাবে ডেটা ফিরে পাবেন তা জানি না। আমি পার্স_স্ট্রি চেষ্টা করেছি এবং এটি কাজ করতে পারিনি। আমি মনে করি এটি মূল্যবান তথ্য হবে
টমাস উইলিয়ামস

2
http_build_queryপ্রত্যাবর্তন param[]এবং স্বল্প সময় নিয়ে যে কারও জন্য সমস্যা রয়েছে param[index]। : এই পোস্ট দেখুন stackoverflow.com/questions/11996573/...
stwhite

2
মানটি ফিরে পেতে আপনাকে কেবল $ ডেটা = $ _GET ['এপ্রাম'] করতে হবে;
dfortun

@dfortun ফিরে আসা গুরুত্বপূর্ণ আপনি অনেক সময় সাশ্রয় করেছেন পার্স_স্ট্রাস্টার () আমার পক্ষে কাজ করে নি তবে $ ডেটা = $ _গেট ['এপ্রাম']; সঠিক সমাধান
আলেশা জর্জ

56

সম্পাদনা করুন: উপরে স্টিফানের সমাধানটি মিস করবেন না, যা খুব http_build_query()কার্যকরী ফাংশন ব্যবহার করে : https://stackoverflow.com/a/1764199/179125

নিটল পালানোর বিষয়ে ঠিক আছে। তবে এটি করার সহজ উপায় রয়েছে:

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

যদি আপনি কোনও সাহসী অ্যারে দিয়ে এটি করতে চান তবে পরিবর্তে এটি চেষ্টা করুন:

পিএইচপি 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)
);

পিএইচপি <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
নিটল

3
নিটল: অ্যারে_ম্যাপ করতে এবং কী এবং মান পৃথকভাবে পাস করার জন্য আমরা একটি কলব্যাক ফাংশন দিয়ে তা করতে পারি। এটা দেখ.
জর্ডান 15

তবে এটি এখনও জিইটি প্যারামিটারের সর্বোচ্চ আকারটি অতিক্রম করতে পারে? যদি আমি পরিবর্তে নীচের বর্ণিত ন্যাশের মতো সেশনগুলি ব্যবহার করি তবে কী প্রতিক্রিয়া রয়েছে?
uji

ঠিক আছে, আপনি একটি সেশনে কম বেশি সীমিত সীমিত পরিমাণে ডেটা সঞ্চয় করতে পারেন। সেশনটির ঝুঁকিটি সেশনটির মেয়াদ শেষ হয়ে গেলে ইউআরএল ভাঙা হয় বা ব্যবহারকারী যদি একবারে দুটি ট্যাবগুলিতে কাজ করার চেষ্টা করে। যদি ব্যবহারকারী পৃষ্ঠাটি বুকমার্ক করে, তবে তাদের অধিবেশনটি শেষ হওয়ার পরে ফিরে আসে, তারা কী প্রত্যাশিত পৃষ্ঠাটি পাবে? দেখে মনে হচ্ছে আপনার নিজের স্থাপত্য সম্পর্কে এবং আপনি কেন প্রথম স্থানে এত বড় অ্যারে ঘুরতে যাচ্ছেন সে সম্পর্কে আপনার আরও কঠোর চিন্তা করার প্রয়োজন হতে পারে।
জর্ডান চলছে

এই উত্তর পোস্ট করার এক বছর পরেও +1 ভাল উত্তর এবং আমার জন্য কাজ করা।
নাভিদ

10

সবচেয়ে সহজ উপায় হ'ল serializeফাংশনটি ব্যবহার করা ।

এটি স্টোরেজ বা স্থানান্তরের জন্য কোনও পরিবর্তনশীলকে সিরিয়ালাইজ করে। আপনি পিএইচপি ম্যানুয়ালটিতে এটি সম্পর্কে পড়তে পারেন - সিরিয়ালাইজ করুন

পরিবর্তনশীল ব্যবহার করে পুনরুদ্ধার করা যেতে পারে unserialize

সুতরাং আপনি যে ইউআরএল ব্যবহার করছেন তা পাস করার সময়:

$url = urlencode(serialize($array))

এবং আপনার ব্যবহারযোগ্য ভেরিয়েবলটি পুনরুদ্ধার করতে

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

যদিও এখানে সাবধান। একটি জিইটি অনুরোধের সর্বাধিক আকার 4k এর মধ্যে সীমাবদ্ধ যা আপনি কোনও ইউআরএল এ অ্যারে পাস করে সহজেই অতিক্রম করতে পারেন।

এছাড়াও, এটি ডেটা পাস করার জন্য সবচেয়ে নিরাপদ উপায় নয়! পরিবর্তে আপনার সম্ভবত সেশনগুলি ব্যবহার করা উচিত।


সিরিয়ালাইজেশন করা এটি করার একটি দুর্দান্ত উপায়, তবে তারপরে এটি আর পাঠযোগ্য নয়
নিটল

1
হ্যাঁ, আপনি যখন ইউআরএল নিয়ে কাজ করছেন তখন সিরিয়ালাইজ করা জিনিসগুলি করার কোনও পরিষ্কার উপায় নয় কারণ এটি ডেটাটিকে এত বেশি প্রসারিত করে। কাস্টম যেতে ভাল।
Kjqai

জিইটি প্যারামিটারের সর্বাধিক আকার হ'ল আমি কেন (মূup়ভাবে) এই আশায় ছিলাম যে পার্সার মন ভেবে দেখবে না যদি এটির একটি অ্যারে পাস হয়ে যায়। আমি এখনই বুঝতে পেরেছি যে এটি সর্বোচ্চ আকারের ছোঁয়া ছাড়াই কাজ করবে না। যাইহোক ন্যাশ ধন্যবাদ, আমি মনে করি আমি এটি অধিবেশনগুলির সাথে করব
উজি

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
ন্যাশ

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

তাই আপনি যদি এই পাস করতে চান তাহলে $arrayকরতে URL মাধ্যমে 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 এনকোড দিয়ে এটি করি। আমার মনে হয় সেরা এবং ক্ষুদ্রতম উপায়। ইউরেনকোডটি অনেক অপচয় করার জায়গা এবং আপনার কাছে মাত্র 4 কে।


1

এটি সরাসরি উত্তর নয় কারণ এরই মধ্যে ইতিমধ্যে উত্তর দেওয়া হয়েছে, তবে প্রত্যেকে ডেটা প্রেরণের বিষয়ে কথা বলছিল, কিন্তু কেউ সেখানে আসলে আপনি কী করেন তা সত্যিই কেউ বলেনি এবং এটি কার্যকর করতে আমার আধ ঘন্টা সময় লেগেছিল। তাই আমি ভেবেছিলাম আমি এখানে সাহায্য করব।

আমি এই বিট পুনরাবৃত্তি করব

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

স্পষ্টতই আপনি এটি www.someurl.com?x=$ প্রশ্নের তুলনায় আরও ভাল ফর্ম্যাট করবেন

এবং তথ্য ফিরে পেতে

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, $ অ্যারে); , var_dump ($ অ্যারে);


স্ট্যাক ওভারফ্লোতে আপনাকে স্বাগতম। অন্য আটটি উত্তরের সাথে দশ বছরের পুরানো প্রশ্নের উত্তর যুক্ত করার সময় আপনার উত্তরটির প্রশ্নের কোন নতুন দিকটি সম্বোধন করা খুব গুরুত্বপূর্ণ very এই মুহুর্তে দেখে মনে হচ্ছে আপনার কাছে কেবল একটি কোড উত্তর রয়েছে যা ইতিমধ্যে অন্য উত্তরগুলির মধ্যে একটি দ্বারা আবৃত। ভবিষ্যতের উত্তরে কোডের জন্য কোড ফর্ম্যাটিং ব্যবহার করুন।
জেসন অ্যালার

0

এটি এই সমস্যাটি সমাধানের আরেকটি উপায়।

$data = array(
              1,
              4,
             'a' => 'b',
             'c' => 'd'
              );
$query = http_build_query(array('aParam' => $data));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.