如何在 PHP 中从 URL 中获取多个具有相同名称的参数

2022-08-30 10:56:30

我有一个PHP应用程序,它有时必须处理URL,其中URL中的多个参数将具有相同的名称。有没有一种简单的方法来检索给定键的所有值?PHP $_GET 仅返回最后一个值。

为了具体说明这一点,我的应用程序是一个OpenURL解析器,可能会得到这样的URL参数:

ctx_ver=Z39.88-2004
&rft_id=info:oclcnum/1903126
&rft_id=http://www.biodiversitylibrary.org/bibliography/4323
&rft_val_fmt=info:ofi/fmt:kev:mtx:book
&rft.genre=book
&rft.btitle=At last: a Christmas in the West Indies. 
&rft.place=London,
&rft.pub=Macmillan and co.,
&rft.aufirst=Charles
&rft.aulast=Kingsley
&rft.au=Kingsley, Charles,
&rft.pages=1-352
&rft.tpages=352
&rft.date=1871

(是的,我知道这很丑陋,欢迎来到我的世界)。请注意,键“rft_id”出现两次:

  1. rft_id=info:oclcnum/1903126
  2. rft_id=http://www.biodiversitylibrary.org/bibliography/4323

$_GET将只返回 被覆盖的前一个值 ()。http://www.biodiversitylibrary.org/bibliography/4323info:oclcnum/1903126

我想访问这两个值。这在 PHP 中可能吗?如果没有,对如何处理这个问题有什么想法吗?


答案 1

像这样:

$query  = explode('&', $_SERVER['QUERY_STRING']);
$params = array();

foreach( $query as $param )
{
  // prevent notice on explode() if $param has no '='
  if (strpos($param, '=') === false) $param += '=';

  list($name, $value) = explode('=', $param, 2);
  $params[urldecode($name)][] = urldecode($value);
}

为您提供:

array(
  'ctx_ver'     => array('Z39.88-2004'),
  'rft_id'      => array('info:oclcnum/1903126', 'http://www.biodiversitylibrary.org/bibliography/4323'),
  'rft_val_fmt' => array('info:ofi/fmt:kev:mtx:book'),
  'rft.genre'   => array('book'),
  'rft.btitle'  => array('At last: a Christmas in the West Indies.'),
  'rft.place'   => array('London'),
  'rft.pub'     => array('Macmillan and co.'),
  'rft.aufirst' => array('Charles'),
  'rft.aulast'  => array('Kingsley'),
  'rft.au'      => array('Kingsley, Charles'),
  'rft.pages'   => array('1-352'),
  'rft.tpages'  => array('352'),
  'rft.date'    => array('1871')
)

由于一个 URL 参数总是可能的重复,因此最好始终具有数组,而不是仅用于预期它们的那些参数。


答案 2

这对你来说不起作用,因为它看起来你不控制查询字符串,但另一个有效的答案:而不是解析查询字符串,你可以将“[]”附加到名称的末尾,然后PHP将创建一个项目数组。

即:

someurl.php?name[]=aaa&name[]=bbb

会给你一个_GET美元,看起来像:

array(0=>'aaa', 1=>'bbb')

推荐