Analysieren Sie die Abfragezeichenfolge in ein Array

195

Wie kann ich eine Zeichenfolge unten in ein Array verwandeln ?

pg_id=2&parent_id=2&document&video 

Dies ist das Array, das ich suche,

array(
    'pg_id' => 2,
    'parent_id' => 2,
    'document' => ,
    'video' =>
)
Laukok
quelle

Antworten:

330

Sie möchten die parse_strFunktion und müssen den zweiten Parameter festlegen, damit die Daten in ein Array anstatt in einzelne Variablen eingefügt werden.

$get_string = "pg_id=2&parent_id=2&document&video";

parse_str($get_string, $get_array);

print_r($get_array);
Anthony
quelle
2
Ich habe ein Problem mit dieser Antwort, weil es nicht funktioniert, wenn Sie denselben Schlüssel mehrmals verwenden (ja, weil in PHP-Array Schlüssel eindeutig sind). So ?key=lorem&key=ipsumwird in Folge array(["key"]=>"ipsum")die Frage ist, gibt es eine Funktion s.th. zu erhalten so array(["key"]=>array("lorem", "ipsum"))oder muss ich diese Funktion selbst erstellen?
MaBi
11
Technisch würde PHP auch so behandeln, ?key=lorem&key=ipsumals hätten Sie nur angegeben, key=ipsumwenn dies die Abfragezeichenfolge in der URL wäre. Und ich denke, es wird als ungültig angesehen, den Schlüssel wiederzuverwenden und konsistente Ergebnisse zu erwarten, oder dass alle Instanzen des Schlüssels beibehalten werden. Der gültige Ansatz, zumindest für eine Abfrage - String zu PHP gesendet, wäre ?key[]=lorem&key[]=ipsum, so dass Ihr homegrown Ansatz für alle Vorkommen von aussehen könnte , &{x}=wo x mehr als einmal vorkommt und ersetzen x[](und die Behandlung genauso wie &)
Anthony
9
@Mabi - oh, und schauen Sie, jemand anderes stimmt Ihnen zu und hat bereits eine eigene Funktion erstellt - php.net/manual/en/function.parse-str.php#76792
Anthony
Das war hilfreich! Ich habe mich vor ?key[]=lorem&key[]=ipsumeinigen Wochen dazu entschlossen . Aber danke, dass du den Link geteilt hast!
MaBi
2
Achten Sie auf Zeichenfolgen mit '+' wie [email protected]. Diese werden von parse_str in ein Leerzeichen analysiert. key = myemail [email protected].
Dudeman
61

Manchmal ist parse_str()allein die Note genau, sie könnte zum Beispiel Folgendes anzeigen:

$url = "somepage?id=123&lang=gr&size=300";

parse_str () würde zurückgeben:

Array ( 
    [somepage?id] => 123 
    [lang] => gr 
    [size] => 300 
)

Es wäre besser, parse_str()mit parse_url()so etwas zu kombinieren :

$url = "somepage?id=123&lang=gr&size=300";
parse_str( parse_url( $url, PHP_URL_QUERY), $array );
print_r( $array );
yassine2020
quelle
3
Ich denke, es wird erwartet$_SERVER['QUERY_STRING']
CpILL
wie man Array zu String URL ex. : Array ([somepage? Id] => 123 [lang] => gr [size] => 300) output = somepage? Id = 123 & lang = gr & size = 300
mehul
31

Verwenden von parse_str().

$str = 'pg_id=2&parent_id=2&document&video';
parse_str($str, $arr);
print_r($arr);
Rakete Hazmat
quelle
18

Verwenden Sie http://us1.php.net/parse_str

Achtung, es wird verwendet:

parse_str($str, &$array);

nicht

$array = parse_str($str);
Ionut Bajescu
quelle
2
Es ist `parse_str ($ str, $ arr);` und kein parse_str($str,&$arr);schrecklicher Fehler
17

Wenn Sie Probleme haben, eine Abfragezeichenfolge aufgrund von codiertem kaufmännischem Und in ein Array zu konvertieren

&

dann unbedingt verwenden html_entity_decode

Beispiel:

// Input string //
$input = 'pg_id=2&parent_id=2&document&video';

// Parse //
parse_str(html_entity_decode($input), $out);

// Output of $out //
array(
  'pg_id' => 2,
  'parent_id' => 2,
  'document' => ,
  'video' =>
)
Casper Wilkes
quelle
14

Es gibt mehrere mögliche Methoden, aber für Sie gibt es bereits eine integrierte parse_strFunktion

$array = array();
parse_str($string, $array);
var_dump($array);
KingCrunch
quelle
3

Dies ist ein Einzeiler zum Parsen von Abfragen von der aktuellen URL in ein Array:

parse_str($_SERVER['QUERY_STRING'], $query);
Hovado
quelle
1

Sie können die PHP-String-Funktion parse_str()gefolgt von einer foreachSchleife verwenden.

$str="pg_id=2&parent_id=2&document&video";
parse_str($str,$my_arr);
foreach($my_arr as $key=>$value){
  echo "$key => $value<br>";
}
print_r($my_arr);
JakeGould
quelle
-3

Dies ist der PHP-Code zum Teilen der Abfrage in MySQL und MSSQL

enter code here
function splitquery($strquery)
{
$arrquery=explode('select',$strquery);

$stry='';$strx='';

for($i=0;$i<count($arrquery);$i++)
{
if($i==1)
{
    echo 'select '.trim($arrquery[$i]);
}
elseif($i>1)
{

$strx=trim($arrquery[($i-1)]);

    if(trim(substr($strx,-1))!='(')
    {
        $stry=$stry.'

select '.trim($arrquery[$i]);
    }
    else
    {
        $stry=$stry.trim('select '.trim($arrquery[$i]));
    }

$strx='';
}
} 

return $stry;
}

Beispiel:

Abfrage vor

wähle xx aus xx wähle xx, (wähle xx) aus xx wobei y = 'cc' wähle xx aus xx linker Join (wähle xx) wobei (wähle oben 1 xxx aus xxx) oder mit xxx desc ";

Abfrage nach

wähle xx aus xx

wähle xx, (wähle xx) aus xx wobei y = 'cc'

Wählen Sie xx aus xx links verbinden (wählen Sie xx), wobei (wählen Sie oben 1 xxx aus xxx) oder durch xxx absteigend

Vielen Dank aus Indonesien Sentrapedagang.com

Dewa Putra
quelle
-5

Für diese spezielle Frage ist die gewählte Antwort korrekt. Wenn die URL jedoch einen redundanten Parameter wie ein zusätzliches "e" enthält, schlägt die Funktion stillschweigend fehl, ohne dass ein Fehler oder eine Ausnahme ausgelöst wird:

a=2&b=2&c=5&d=4&e=1&e=2&e=3 

Deshalb bevorzuge ich es, meinen eigenen Parser wie folgt zu verwenden:

//$_SERVER['QUERY_STRING'] = `a=2&b=2&c=5&d=4&e=100&e=200&e=300` 

$url_qry_str  = explode('&', $_SERVER['QUERY_STRING']);

//arrays that will hold the values from the url
$a_arr = $b_arr = $c_arr = $d_arr = $e_arr =  array();

foreach( $url_qry_str as $param )
    {
      $var =  explode('=', $param, 2);
      if($var[0]=="a")      $a_arr[]=$var[1];
      if($var[0]=="b")      $b_arr[]=$var[1];
      if($var[0]=="c")      $c_arr[]=$var[1];
      if($var[0]=="d")      $d_arr[]=$var[1];
      if($var[0]=="e")      $e_arr[]=$var[1];
    }

    var_dump($e_arr); 
    // will return :
    //array(3) { [0]=> string(1) "100" [1]=> string(1) "200" [2]=> string(1) "300" } 

Jetzt haben Sie alle Vorkommen jedes Parameters in einem eigenen Array. Sie können sie jederzeit zu einem Array zusammenführen, wenn Sie möchten.

Hoffentlich hilft das!

Nassim
quelle
Sie sollten niemals denselben Abfrageparameternamen mit unterschiedlichen Werten haben. Es macht keinen Sinn, da sowieso nur einer akzeptiert wird.
Cristian
3
@Cristian: "Sie sollten niemals denselben Abfrageparameternamen mit unterschiedlichen Werten haben." Sie haben Recht, aber in der Antwort heißt es: "... die URL, bei der die Funktion stillschweigend fehlschlägt, ohne dass ein Fehler oder eine Ausnahme ausgelöst wird." Welches könnte eine Anwendung brechen. Diese Antwort ist zwar nicht großartig, zeigt jedoch ein Problem auf. Vor allem, wenn Ihre Anwendung von jemandem abgestürzt werden kann, der nur willkürlich eine Anfrage mit zusätzlichen Parametern stellt.
JakeGould