PHP bir URL'den aynı isimde birden fazla parametre almak nasıl

6 Cevap php

Ben vesilesiyle URL birden fazla parametre aynı ada sahip olacaktır URL'leri işlemek zorunda olacak bir PHP uygulama var. Belirli bir anahtar için tüm değerleri almak için kolay bir yol var mı? PHP $ _GET sadece son değeri döndürür.

Bu somut hale getirmek için, benim uygulama bir OpenURL çözümleyici, ve bu gibi URL parametreleri alabilirsiniz:

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

(Evet, ben bu çirkin biliyorum benim dünyama hoş geldiniz). Anahtar "rft_id" iki kez görünür unutmayın:

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

$_GET sadece http://www.biodiversitylibrary.org/bibliography/4323, önceki değer (info:oclcnum/1903126) üzerine edilerek dönecektir.

Ben hem değerlerine erişmek istiyorum. Bu PHP mümkün mü? Eğer değilse, bu sorunun üstesinden nasıl herhangi bir düşünce?

6 Cevap

Gibi bir şey:

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

foreach( $query as $param )
{
  list($name, $value) = explode('=', $param);
  $params[urldecode($name)][] = urldecode($value);
}

verir:

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')
)

Eğer sorgu dizesi kontrol yok gibi görünüyor gibi sizin için çalışmaz, ama başka bir geçerli cevap: yerine ayrıştırma sorgu dizesi, sen adının sonuna '[]' appeand olabilir, daha sonra PHP bir dizi yapacak ürün.

IE:

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

: Sana bir $ _GET görünümlü gibi verecektir

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

Sana $_SERVER['QUERY_STRING'] elle ayrıştırmak zorunda düşünüyorum.

(Denenmemiş) gibi bir şey:

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

Bu size bir dizi vermelidir $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')
)

Kendi adıyla özel tuşları erişmek mümkün yapar gibi Tomalak's cevabı gördükten sonra, ben çok daha iyi çıkan dizi için yaptığı veri formatını seviyorum.

AFAIK ikinci değer olarak $ _GET kullanarak yinelenen değerleri almak için hiçbir şekilde ilk üzerine yazacaktır var

$ _SERVER ['QUERY_STRING'] kullanarak ham sorgu dizesi erişmek ve daha sonra kendiniz ayrıştırmak etrafında almak için.

Eğer böyle bir sorgu dizesi vardır varsayılır:

param1=2549&appname=appName1&appname=appName2&appname=appName3&appname=appName4&appname=appName5&apptype=thetype&idsess=1231324567980147dzeze55sd4&action=myaction

Bunu yapabilirsiniz:

public static function getMultipleParameters()
    {
        $query = $_SERVER['QUERY_STRING'];
        $vars = array();
        $second = array();
        foreach (explode('&', $query) as $pair) {
            list($key, $value) = explode('=', $pair);
            if('' == trim($value)){
                continue;
            }

            if (array_key_exists($key, $vars)) {
                if (!array_key_exists($key, $second))
                    $second[$key][] .= $vars[$key];
                $second[$key][] = $value;
            } else {
                $vars[$key] = urldecode($value);
            }
        }
        return array_merge($vars, $second);
    }

O verir:

array (
  'param1' => '2549',
  'appname' => 
      array (
        0 => 'appName1',
        1 => 'appName2',
        2 => 'appName3',
        3 => 'appName4',
        4 => 'appName5',
  ),
  'apptype' => 'thetype',
  'idsess' => '1231324567980147dzeze55sd4',
  'action' => 'myaction',
);

Umut olur ;)

Bu fonksiyonun benim sürümünü paylaşmak

function parse_mstr($query_string,&$query=array()){
    $params  = explode('&', $query_string);
    foreach( $params as $param ){
        $k = $param;
        $v = '';
        if(strpos($param,'=')){
            list($name, $value) = explode('=', $param);
            $k = rawurldecode($name);
            $v = rawurldecode($value);
        }
        if(isset($query[$k])){
            if(is_array($query[$k])){
                $query[$k][] = $v;
            }else{
                $query[$k] = array($query[$k],$v);
            }
        }else{
            $query[$k] = $v;
        }
    }
}