Как получить несколько параметров с тем же именем от URL в PHP

У меня есть приложение 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/4323, более раннее значение (info:oclcnum/1903126) быть перезаписанным.

Я хотел бы получить доступ к обоим значениям. Действительно ли это возможно в PHP? В противном случае какие-либо мысли о том, как решить эту проблему?

43
задан Tomalak 10 December 2008 в 02:40
поделиться

4 ответа

Что-то как:

$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 повторяется, лучше всегда иметь массивы, вместо только для тех параметров, где Вы ожидаете их.

65
ответ дан Tomalak 26 November 2019 в 22:31
поделиться

Не будет работать на Вас, поскольку похоже, что Вы не управляете querystring, но другим действительным ответом: Вместо синтаксического анализа querystring, Вы могли appeand' []' до конца имени, тогда PHP сделает массив объектов.

IE:

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

даст Вам $ _GET сходство с:

array(0=>'aaa', 1=>'bbb')
38
ответ дан benlumley 4 August 2019 в 17:44
поделиться

Я думаю, что необходимо было бы проанализировать $_SERVER['QUERY_STRING'] вручную.

Что-то как (непротестированный):

$query = $_SERVER['QUERY_STRING'];
$vars = array();
foreach (explode('&', $query) as $pair) {
    list($key, $value) = explode('=', $pair);
    $vars[] = array(urldecode($key), urldecode($value));
}

Это должно дать Вам массив $vars:

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

Видя ответ Tomalak, мне нравится его формат данных за полученный массив намного лучше, поскольку он позволяет получить доступ к определенным ключам их именем.

10
ответ дан Community 26 November 2019 в 22:31
поделиться

AFAIK там не является никаким способом получить дублирующееся использование значений $_GET поскольку второе значение перезапишет первое

Для обхождения его, Вы могли получить доступ к сырым данным querystring использование $_SERVER['QUERY_STRING'] и затем проанализируйте его сами.

3
ответ дан Jin Kwon 26 November 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: