【问题标题】:Passing arrays as url parameter将数组作为 url 参数传递
【发布时间】:2010-12-18 07:44:59
【问题描述】:

我可以将数组作为 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';

【问题讨论】:

  • 为什么不能直接传入$_POST
  • 这看起来真的很乱。但对于这种方法,它必须是。其他稍微复杂的方法是分配query = array('aParam'=> json_encode($arrayOfValues))。并且您可以使用url_encode(implode('/',$query)) 传递更好的网址。网址看起来像 www.example.com/aParam/[va1,val2,...]。接收时,您必须将参数值 json_decode 到数组中。

标签: php arrays url


【解决方案1】:

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

【讨论】:

  • 如果您想知道如何将其返回到数组中,答案是parse_str()
  • 我已经使用它来将 url 放入数组中,但不知道如何取回数据。我试过 parse_str 并不能让它工作。我认为这将是有价值的信息
  • 对于遇到http_build_query 返回param[] 和somtimes param[index] 的问题的任何人。看看这篇文章:stackoverflow.com/questions/11996573/…
  • 取回你只需要 $data = $_GET['aParam'];
  • @dfortun 回来很重要,您节省了很多时间 parse_str() 对我不起作用,但 $data = $_GET['aParam'];是正确的解决方案
【解决方案2】:

编辑:不要错过上面 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 (回调)

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

【讨论】:

  • 整洁!如果它也可以与关联数组一起使用会很好。无论如何都要 +1
  • knittl:我们可以通过对 array_map 的回调函数并分别传递键和值来做到这一点。看看吧。
  • 但这仍然可能超过 GET 参数的最大大小,对吧?如果我像下面提到的纳什那样使用会话,那么几率是多少?
  • 嗯,您可以在会话中存储或多或少无限量的数据。会话的风险在于会话到期时 URL 中断,或者用户尝试执行某些操作,例如一次在两个选项卡中。如果用户将页面添加为书签,然后在会话到期后返回,他们还会得到他们期望的页面吗?听起来您可能需要更加仔细地思考您的架构以及为什么要首先传递如此庞大的数组。
  • +1 好答案,在发布此答案一年后也为我工作。
【解决方案3】:

最简单的方法是使用serialize 函数。

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

可以使用unserialize恢复变量

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

$url = urlencode(serialize($array))

并恢复您使用的变量

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

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

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

【讨论】:

  • 序列化也是一种不错的方法,但它不再是一种可读的形式
  • 是的,当您使用 url 时,序列化并不是一种真正干净的做事方式,因为它会大量扩展数据。最好去定制。
  • GET 参数的最大大小是我担心的,这就是为什么我(愚蠢地)希望解析器不会介意它是否传递了一个数组。我刚刚意识到,如果不触及最大尺寸,它将无法工作。无论如何,谢谢纳什,我想我会用会话来做这件事
  • 你真的不应该将不受信任的数据传递给 unserialize()。改用 json_encode() 和 json_decode()。
【解决方案4】:

请在输出时转义变量 (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);
}

【讨论】:

  • 您可以使用临时数组来存储您的值,并使用 implode afterwords,而不是使用“first”变量来跳过第一个 &。只是为了可读性。 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

所以如果你想通过 URL 将这个$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

【讨论】:

    【解决方案6】:

    我使用base64 编码的序列化数据库来执行此操作。我猜是最好和最小的方式。 urlencode 太浪费空间了,你只有 4k。

    【讨论】:

      【解决方案7】:

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

      我再重复一遍

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

      【讨论】:

        【解决方案8】:
        **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'];
        

        【讨论】:

          【解决方案9】:

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

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

          【讨论】:

          • 欢迎来到 Stack Overflow。当添加一个包含八个其他答案的十年前问题的答案时,指出您的答案所针对的问题的新方面非常重要。现在,您似乎有一个仅代码的答案,该答案已被其他答案之一涵盖。请在以后的答案中使用代码格式。
          【解决方案10】:

          您可以将 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】:

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

            用户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
            )
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-03-22
              • 2012-10-17
              • 1970-01-01
              • 1970-01-01
              • 2011-12-19
              • 2011-08-12
              相关资源
              最近更新 更多