将数组作为url参数传递

uji*_*uji 109 php arrays url

我可以将数组作为url参数传递的最佳方法是什么?我在想这是否可行:

$aValues = array();

$url = 'http://www.example.com?aParam='.$aValues;
Run Code Online (Sandbox Code Playgroud)

或者这个怎​​么样:

$url = 'http://www.example.com?aParam[]='.$aValues;
Run Code Online (Sandbox Code Playgroud)

我已经阅读过例子,但我觉得它很乱:

$url = 'http://www.example.com?aParam[]=value1&aParam[]=value2&aParam[]=value3';
Run Code Online (Sandbox Code Playgroud)

Ste*_*rig 211

有一个非常简单的解决方案:http_build_query().它将您的查询参数作为关联数组:

$data = array(
    1,
    4,
    'a' => 'b',
    'c' => 'd'
);
$query = http_build_query(array('aParam' => $data));
Run Code Online (Sandbox Code Playgroud)

将返回

string(63) "aParam%5B0%5D=1&aParam%5B1%5D=4&aParam%5Ba%5D=b&aParam%5Bc%5D=d"
Run Code Online (Sandbox Code Playgroud)

http_build_query()为你处理所有必要的转义(%5B=> [%5D=> ]),所以这个字符串等于aParam[0]=1&aParam[1]=4&aParam[a]=b&aParam[c]=d.

  • 如果您想知道如何将其重新放回数组中,答案是[parse_str()](http://us1.php.net/manual/en/function.parse-str.php). (12认同)
  • http_build_query也适用于嵌套数组 (7认同)
  • 好东西,顺便说一下这是facebook开发者编码的方式 (3认同)
  • 对于遇到 `http_build_query` 返回 `param[]` 和有时返回 `param[index]` 问题的任何人。看看这篇文章:/sf/ask/839760141/ (2认同)
  • 获取你需要的值$ data = $ _GET ['aParam']; (2认同)

Jor*_*ing 55

编辑:不要错过上面的Stefan解决方案,它使用非常方便的http_build_query()功能:https://stackoverflow.com/a/1764199/179125

knittl是关于逃避的.但是,有一种更简单的方法:

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

如果要使用关联数组执行此操作,请尝试以下操作:

PHP 5.3+(lambda函数)

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

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));
Run Code Online (Sandbox Code Playgroud)

  • knittl:我们可以使用array_map的回调函数并分别传递键和值.看看这个. (3认同)

nas*_*ash 10

最简单的方法是使用该serialize功能.

它序列化任何变量以进行存储或传输.你可以在php手册中阅读它- serialize

可以使用恢复变量 unserialize

所以在传递给您使用的URL时:

$url = urlencode(serialize($array))

并恢复您使用的变量

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

不过要小心.GET请求的最大大小限制为4k,通过在URL中传递数组可以轻松超过这个大小.

此外,它真的不是最安全的数据传递方式!您应该考虑使用会话.

  • 你真的不应该将不受信任的数据传递给unserialize().请尝试使用json_encode()和json_decode(). (4认同)

kni*_*ttl 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);
}
Run Code Online (Sandbox Code Playgroud)


Thu*_*asa 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";
?> 
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

因此,如果您要将其$array通过URL 传递给page_no_2.php

例如:-

$url ='http://page_no_2.php?data=".$strenc."';
Run Code Online (Sandbox Code Playgroud)

要返回原始数组,它必须为urldecode(),然后为unserialize(),如page_no_2.php中所示:

    <?php
    $strenc2= $_GET['data'];
    $arr = unserialize(urldecode($strenc2));
    var_dump($arr);
    ?>
Run Code Online (Sandbox Code Playgroud)

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

再次:D