How to get multiple parameters with same name from a URL in PHP
Something like:
$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);
}
gives you:
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')
)
Since it's always possible that one URL parameter is repeated, it's better to always have arrays, instead of only for those parameters where you anticipate them.
Won't work for you as it looks like you don't control the querystring, but another valid answer: Instead of parse querystring, you could appeand '[]' to the end of the name, then PHP will make an array of the items.
IE:
someurl.php?name[]=aaa&name[]=bbb
will give you a $_GET looking like:
array(0=>'aaa', 1=>'bbb')
I think you'd have to parse $_SERVER['QUERY_STRING']
manually.
Something like (untested):
$query = $_SERVER['QUERY_STRING'];
$vars = array();
foreach (explode('&', $query) as $pair) {
list($key, $value) = explode('=', $pair);
$vars[] = array(urldecode($key), urldecode($value));
}
This should give you an array $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')
)
After having seen Tomalak's answer, I like his data format for the resulting array much better, as it makes it possible to access specific keys by their name.