web-dev-qa-db-ja.com

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

配列を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';
104
uji

非常に簡単な解決策があります: 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と等しくなります。

204
Stefan Gehrig

Edit:非常に便利な http_build_query() 関数を使用する上記のStefanのソリューションをお見逃しなく: 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));
55
Jordan Running

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

ストレージまたは転送のために変数をシリアル化します。 php manual-serialize でそれについて読むことができます

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

そのため、使用するURLへの受け渡しでは:

$url = urlencode(serialize($array))

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

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

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

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

10
nash

出力時に変数をエスケープしてください( 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);
}
6
knittl
 <?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."';

元の配列に戻すには、page_no_2.phpのように、urldecode()、次にunserialize()にする必要があります。

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

4

シリアル化されたbase64エンコードでこれを行います。最善かつ最小の方法だと思います。 urlencodeは多くのスペースを無駄にし、4kしかありません。

3
Viktor

これは既に回答されているので直接的な回答ではありませんが、誰もがデータの送信について話していましたが、そこに着いたときにあなたが何をするのか本当に誰も言っていませんでした。だから私はここで手伝うと思った。

このビットを繰り返します

$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
Thomas Williams
**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
user2638158