将数组作为url参数传递

时间:2009-11-19 14:07:30

标签: php arrays 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';

12 个答案:

答案 0 :(得分:203)

有一个非常简单的解决方案: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

答案 1 :(得分: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));

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

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('&', array_map('urlify', array_keys($aValues), $aValues));

答案 2 :(得分:10)

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

它序列化任何变量以进行存储或传输。您可以在php manual - serialize

中阅读相关内容

可以使用unserialize

恢复变量

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

$url = urlencode(serialize($array))

并恢复您使用的变量

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

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

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

答案 3 :(得分: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);
}

答案 4 :(得分:3)

 <?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通过网址传递给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

答案 5 :(得分:3)

我使用序列化数据base64编码。我想是最好也是最小的方式。 urlencode会浪费太多空间而你只有4k。

答案 6 :(得分:0)

这不是直接答案,因为这已经得到了解答,但是每个人都在谈论发送数据,但没有人真正说出你到达那里时做了什么,我花了半个小时才完成工作出来。所以我想我会在这里帮忙。

我会重复这一点

$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'];

答案 7 :(得分: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'];

答案 8 :(得分:0)

在收到的页面中,您可以使用:

parse_str($ str,$ array); var_dump($ array);

答案 9 :(得分:0)

这是解决此问题的另一种方法。

$data = array(
              1,
              4,
             'a' => 'b',
             'c' => 'd'
              );
$query = http_build_query(array('aParam' => $data));

答案 10 :(得分:0)

您可以将 urlencodedjson_encode

结合使用

示例:

<?php

$cars = array
(
    [0] => array
        (
            [color] => "red",
            [name] => "mustang",
            [years] => 1969
        ),

    [1] => array
        (
            [color] => "gray",
            [name] => "audi TT",
            [years] => 1998
        )

)

echo "<img src='your_api_url.php?cars=" . urlencode(json_encode($cars)) . "'/>"

?>

祝你好运! ?

答案 11 :(得分:0)

很容易将数组作为参数发送。

用户 serialize 函数如下所述

$url = www.example.com

$array = array("a" => 1, "b" => 2, "c" => 3);

将数组作为参数发送

$url?array=urlencode(serialize($array));

在函数或其他端获取参数使用unserialize

$param = unserialize(urldecode($_GET['array']));

echo '<pre>';
print_r($param);
echo '</pre>';

Array
(
    [a] => 1
    [b] => 2
    [c] => 3
)