我有一个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') )
不会对你起作用,因为看起来你不控制查询字符串,但是另一个有效的答案:你可以在名称的末尾加上'[]'而不是解析查询字符串,然后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的回答之后,我更喜欢他的数据格式,因为它可以通过名字访问特定的密钥.
没有必要为此使用愚蠢的explode
变通办法.一个简单的正则表达式可以更容易地使用多个同名参数来纠正QUERY_STRING:
// Replace `&x=1&x=2` into `x[]=1&x[]=2` $qs = preg_replace("/(?<=^|&)(\w+)(?==)/", "$1[]", $_SERVER["QUERY_STRING"]);
然后它就像使用一样简单parse_str
:
parse_str($qs, $new_GET);
这具有正确解码%xy
URL转义的优势.
如果您只想将一个或几个特定参数提取为数组,那么请使用(id|name)
而不是(\w+)
在正则表达式中.