Wie man mehrere Parameter mit dem gleichen Namen von einer URL in PHP bekommen

stimmen
40

Ich habe eine PHP-Anwendung, die gelegentlich muß URLs behandeln, in denen mehr als ein Parameter in der URL die gleichen Namen haben. Gibt es eine einfache Möglichkeit, alle Werte für einen bestimmten Schlüssel zurückzuholen? PHP $ _GET gibt nur den letzten Wert.

Um dieses zu konkretisieren, meine Anwendung ist ein OpenURL Resolver und kann URL-Parameter wie diese:

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

(Ja, ich weiß, es ist hässlich, willkommen in meiner Welt). Beachten Sie, dass die Taste „rft_id“ erscheint zweimal:

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

$_GETkehrt nur http://www.biodiversitylibrary.org/bibliography/4323der frühere Wert (, info:oclcnum/1903126) mit worden überschrieben.

Ich möchte Zugriff auf beide Werte erhalten. Ist das möglich in PHP? Wenn nicht, keine Gedanken darüber, wie dieses Problem umgehen?

Veröffentlicht am 09/12/2008 um 17:33
quelle vom benutzer
In anderen Sprachen...                            


7 antworten

stimmen
63

Etwas wie:

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

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

gibt Ihnen:

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')
)
Beantwortet am 09/12/2008 um 17:46
quelle vom benutzer

stimmen
37

Wird nicht für Sie arbeiten, wie es aussieht wie du nicht die Abfragezeichenfolgeflag steuern, sondern eine andere gültige Antwort: Statt Parse Abfragezeichenfolgeflag, könnten Sie appeand ‚[]‘ bis zum Ende des Namens, so wird PHP ein Array von der machen Artikel.

IE:

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

geben Ihnen einen $ _GET suchen, wie:

array(0=>'aaa', 1=>'bbb')
Beantwortet am 09/12/2008 um 17:41
quelle vom benutzer

stimmen
9

Ich glaube , Sie haben analysieren würde $_SERVER['QUERY_STRING']manuell.

So etwas wie (nicht getestet):

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

Dies sollte man ein Array geben $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')
)

Nachdem gesehen Tomalak die Antwort, ich mag sein Datenformat für das resultierende Array viel besser, als sie es ermöglicht , bestimmte Tasten durch ihren Namen zuzugreifen.

Beantwortet am 09/12/2008 um 17:37
quelle vom benutzer

stimmen
4

Es gibt keine Notwendigkeit , dumm zu verwenden explodeAbhilfen für diese. Eine einfache regex kann leichter eine QUERY_STRING mit mehreren gleich benannte Parameter korrigieren:

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

Dann ist es so einfach wie mit parse_str:

parse_str($qs, $new_GET);

Was hat den Vorteil , richtig decodiert %xyURL sofort entweicht.

Wenn Sie nur eine einzige oder einige spezifische Parameter als Array extrahiert wollen, dann verwenden Sie (id|name)statt (\w+)in der Regex.

Beantwortet am 21/09/2015 um 17:34
quelle vom benutzer

stimmen
2

AFAIK gibt es keinen Weg , um doppelte Werte zu erhalten unter Verwendung $_GETals der zweite Wert ist die erste überschreiben

Um das zu umgehen es könnte man die rohen Abfragezeichenfolgeflag Zugriff verwenden $_SERVER['QUERY_STRING']und es dann selbst analysieren.

Beantwortet am 09/12/2008 um 17:38
quelle vom benutzer

stimmen
1

Teile meiner Version dieser Funktion

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;
        }
    }
}
Beantwortet am 09/05/2013 um 15:21
quelle vom benutzer

stimmen
1

Angenommen Sie haben eine Abfrage-Zeichenfolge wie folgt aussehen:

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

Du kannst das :

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);
    }

Das gibt :

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

Ich hoffe, das hilft ;)

Beantwortet am 04/07/2012 um 17:18
quelle vom benutzer

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