配列をURLパラメータとして渡す


115

配列をURLパラメータとして渡す最良の方法は何ですか?これが可能かどうか私は考えていました:

$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を渡すことができますurl_encode(implode('/',$query))。URLはのようになりますwww.example.com/aParam/[va1,val2,...]。受け取ったら、aParamの値を配列にjson_decodeする必要があります。
Vladimir Vukanac 2014年

回答:


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()です。
タイポ2014

1
これを使用して配列にURLを配置しましたが、データを取得する方法がわかりません。parse_strを試してみましたが、動作しませんでした。これは貴重な情報になると思います
トーマスウィリアムズ

2
http_build_query戻ることparam[]とsomtimesで問題に直面している人のためにparam[index]。この記事をチェックアウト:stackoverflow.com/questions/11996573/...
stwhite

2
必要な値を取得するには、$ data = $ _GET ['aParam'];
dfortun 2018

@dfortun get backはあなたが多くの時間を節約することが重要ですparse_str()は私にとってはうまくいきませんでしたが$ data = $ _GET ['aParam']; 正しい解決策です
Asesha George

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 2009年

3
knittl:array_mapへのコールバック関数を使用して、キーと値を個別に渡すことでそれを行うことができます。見てみな。
ジョーダン、

しかし、これはまだGETパラメータの最大サイズを超える可能性がありますか?下記のナッシュのようにセッションを使用する場合、確率はどのくらいですか?
uji 2009年

さて、セッションには多かれ少なかれ無制限の量のデータを保存できます。セッションのリスクは、セッションの有効期限が切れたとき、またはユーザーが2つのタブなどで同時に操作しようとした場合にURLが破損することです。ユーザーがページをブックマークし、セッションの有効期限が切れた後に戻ってきた場合でも、期待どおりのページが表示されますか?アーキテクチャについてもっと深く考える必要があるかもしれませんし、そもそもなぜそのような巨大な配列を迂回しているのでしょうか。
ジョーダン、

良い答えを+1して、この回答を1年投稿した後も私のために働いています。
2011年

10

最も簡単な方法は、serialize関数を使用することです。

ストレージまたは転送のために変数をシリアル化します。あなたはそれについてPHPマニュアルで読むことができます-シリアライズ

変数は以下を使用して復元できます unserialize

したがって、使用するURLへの受け渡しでは:

$url = urlencode(serialize($array))

使用する変数を復元するには

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

ここで注意してください。GETリクエストの最大サイズは4kに制限されています。これは、URLで配列を渡すことで簡単に超えることができます。

また、データを渡す最も安全な方法とは言えません。代わりにセッションの使用を検討する必要があります。


シリアル化もそれを行うための良い方法ですが、それはもはやそれほど読み
にくい

1
ええ、シリアライズはデータを非常に拡張するので、URLで作業しているときに実際にクリーンな方法ではありません。カスタムする方が良い。
Kzqai 2009年

GETパラメーターの最大サイズは、私が(愚かに)渡された配列がパーサーであることを気にしないことを(愚かに)期待していた理由で心配でした。最大サイズに触れないと動作しないことに気づきました。とにかくナッシュのおかげで、私はセッションでそれをやると思います
uji

4
信頼できないデータをunserialize()に渡すべきではありません。代わりにjson_encode()とjson_decode()を試してください。
ミッコランタライネン2015年

6

出力するときは変数をエスケープしてください(urlencode)。

配列を出力するだけではなく、何らかの方法でループを使用してURLを作成する必要があります

$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"
}

もう一度:D



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($ array);


Stack Overflowへようこそ。10年前の質問に8つの回答を追加して回答を追加する場合、回答の質問の新しい側面を指摘することが非常に重要です。現在、他の回答のいずれかですでにカバーされているコードのみの回答があるようです。今後の回答では、コードのフォーマットをコードに使用してください。
Jason Aller

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.