将数组作为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_encode(implode('/',$query))。网址看起来像www.example.com/aParam/[va1,val2,...]。接收时,您必须将aParam值json_decode转换为数组。
Vladimir Vukanac 2014年

Answers:


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()
Typo 2014年

1
我已经用它把URL放在数组中,但是不知道如何获取数据。我尝试了parse_str,但无法正常工作。我认为这将是有价值的信息
托马斯·威廉姆斯

2
对于任何运行与问题http_build_query返回param[]和somtimes param[index]。看看这个帖子:stackoverflow.com/questions/11996573/…–
stwhite

2
取回值,您只需要$ data = $ _GET ['aParam'];
dfortun '18 -4-28

@dfortun回来很重要,您节省了很多时间parse_str()对我不起作用,但是$ data = $ _GET ['aParam']; 是正确的解决方案
Asesha George

56

编辑:不要错过以上使用非常方便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+(lambda函数)

$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参数的最大大小,对不对?如果我像下面提到的nash那样使用会话,那么几率是多少?
2009年

好了,您可以在一个会话中存储或多或少的无限量的数据。会话的风险在于会话过期或用户尝试一次在两个选项卡中执行操作时URL断开。如果用户为该页面添加了书签,则会话期满后又回来了,他们是否还会获得他们期望的页面?听起来您可能需要更加仔细地考虑您的体系结构以及为什么首先要绕过如此庞大的数组。
乔丹(Jordan)

发布此答案一年后,+ 1好的答案并为我工作。
函数naveed

10

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

它序列化任何变量以进行存储或传输。您可以在php手册中了解它-序列化

该变量可以通过使用恢复 unserialize

因此,在传递给URL时,您将使用:

$url = urlencode(serialize($array))

并还原您使用的变量

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

不过要小心。GET请求的最大大小限制为4k,您可以通过在URL中传递数组来轻易地超过它。

而且,它确实不是最安全的数据传递方式!您可能应该考虑改为使用会话。


序列化也是一种不错的方法,但是它现在已经不那么可读了
knittl

1
是的,当您使用url时,序列化并不是真正的干净方法,因为它可以扩展数据。最好去定制。
Kzqai

GET参数的最大大小是我担心的,这就是为什么我(愚蠢地)希望解析器不介意是否传递了数组。我刚刚意识到,不触摸最大尺寸将无法正常工作。无论如何,还是要感谢纳什,我想我会在会议中做到这一点
uji

4
您确实不应将不受信任的数据传递给unserialize()。尝试改用json_encode()和json_decode()。
Mikko Rantalainen 2015年

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

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);


欢迎使用堆栈溢出。在为十年历史的问题加上其他八个问题的答案时,指出您的答案要解决问题的新方面非常重要。现在看来,您有一个仅包含代码的答案已被其他答案之一覆盖。请在以后的答案中使用代码格式来编写代码。
杰森·艾勒

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.