У меня есть приложение 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" появляется дважды:
rft_id=info:oclcnum/1903126
rft_id=http://www.biodiversitylibrary.org/bibliography/4323
$_GET
возвратится просто http://www.biodiversitylibrary.org/bibliography/4323
, более раннее значение (info:oclcnum/1903126
) быть перезаписанным.
Я хотел бы получить доступ к обоим значениям. Действительно ли это возможно в PHP? В противном случае какие-либо мысли о том, как решить эту проблему?
Что-то как:
$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 повторяется, лучше всегда иметь массивы, вместо только для тех параметров, где Вы ожидаете их.
Не будет работать на Вас, поскольку похоже, что Вы не управляете querystring, но другим действительным ответом: Вместо синтаксического анализа querystring, Вы могли appeand' []' до конца имени, тогда PHP сделает массив объектов.
IE:
someurl.php?name[]=aaa&name[]=bbb
даст Вам $ _GET сходство с:
array(0=>'aaa', 1=>'bbb')
Я думаю, что необходимо было бы проанализировать $_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, мне нравится его формат данных за полученный массив намного лучше, поскольку он позволяет получить доступ к определенным ключам их именем.
AFAIK там не является никаким способом получить дублирующееся использование значений $_GET
поскольку второе значение перезапишет первое
Для обхождения его, Вы могли получить доступ к сырым данным querystring использование $_SERVER['QUERY_STRING']
и затем проанализируйте его сами.