PHP'de bir URL'den aynı ada sahip birden çok parametre nasıl alınır

oy
40

Ara sıra adresten birden fazla parametre aynı ada sahip olur URL'leri işlemek zorunda kalacak bir PHP uygulaması vardır. 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 getirelim, başvurum OpenURL çözümleyici, ve bunun gibi URL parametrelerini 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, dünyama hoşgeldin, çirkin biliyorum). Anahtar rft_id iki kez göründüğünü unutmayın:

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

$_GETSadece dönecektir http://www.biodiversitylibrary.org/bibliography/4323, daha önceki değeri ( info:oclcnum/1903126) üzerine yazılmış olan.

Her iki değerlerine erişmek istiyorum. Bu PHP mümkün mü? Değilse, bu sorunu nasıl ele alınacağı üzerinde herhangi bir düşünce?

Oluştur 09/12/2008 saat 17:33
kaynak kullanıcı
Diğer dillerde...                            


7 cevaplar

oy
63

Gibi bir şey:

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

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

sana 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')
)
Cevap 09/12/2008 saat 17:46
kaynak kullanıcı

oy
37

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

IE:

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

gibi bakıyor size $ GETin verecektir:

array(0=>'aaa', 1=>'bbb')
Cevap 09/12/2008 saat 17:41
kaynak kullanıcı

oy
9

Sana ayrıştırmak olurdu düşünmek $_SERVER['QUERY_STRING']el.

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

Gördükten sonra Tomalak en onların adına göre belirli tuşlara erişmek mümkün kılar olarak cevap, ben, ortaya çıkan dizinin çok daha iyi onun veri formatını gibi.

Cevap 09/12/2008 saat 17:37
kaynak kullanıcı

oy
4

Aptal kullanmaya gerek yoktur explodebunun için geçici çözümler. Basit bir düzenli ifade daha kolay çoklu gibi adlandırılmış parametrelerle bir QUERY_STRING düzeltmek edebilirsiniz:

// Replace `&x=1&x=2` into `x[]=1&x[]=2`
$qs = preg_replace("/(?<=^|&)(\w+)(?==)/", "$1[]", $_SERVER["QUERY_STRING"]);

Sonra kullanmak kadar basit parse_str:

parse_str($qs, $new_GET);

Hangi düzgün deşifre avantajına sahiptir %xyhemen kaçar URL'yi.

Eğer sadece bir tek veya dizi olarak çıkarılan birkaç belirli parametreler isterseniz, o zaman kullanmak (id|name)yerine (\w+)regex.

Cevap 21/09/2015 saat 17:34
kaynak kullanıcı

oy
2

AFAIK kullanarak yinelenen değerleri almak için bir yolu yoktur $_GETbirinci üzerine yazacaktır ikinci değer olarak

Etrafında almak için kullandığınız ham sorgu dizesi erişebilir $_SERVER['QUERY_STRING']ve daha sonra kendiniz ayrıştırmak.

Cevap 09/12/2008 saat 17:38
kaynak kullanıcı

oy
1

Bu fonksiyonun benim versiyonunu Paylaşım

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;
        }
    }
}
Cevap 09/05/2013 saat 15:21
kaynak kullanıcı

oy
1

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

Param1 = 2549 & appname = appName1 & appname = appName2 & appname = appName3 & appname = appName4 & appname = appName5 & apptype = thetype & idsess = 1231324567980147dzeze55sd4 ve etki = 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);
    }

Yani verir:

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

Umarım yardımcı olur ;)

Cevap 04/07/2012 saat 17:18
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more