Analyser la chaîne de requête dans un tableau

202

Comment puis-je transformer une chaîne ci-dessous en un tableau ?

pg_id=2&parent_id=2&document&video 

C'est le tableau que je recherche,

array(
    'pg_id' => 2,
    'parent_id' => 2,
    'document' => ,
    'video' =>
)
laukok
la source

Réponses:

339

Vous voulez la parse_strfonction et vous devez définir le deuxième paramètre pour que les données soient placées dans un tableau plutôt que dans des variables individuelles.

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

parse_str($get_string, $get_array);

print_r($get_array);
Anthony
la source
2
J'ai un problème avec cette réponse, car cela ne fonctionne pas si vous utilisez la même clé plusieurs fois (oui car en php, les clés du tableau sont uniques). Donc ?key=lorem&key=ipsum, array(["key"]=>"ipsum")la question est de savoir s'il existe une fonction pour obtenir le résultat. comme ça array(["key"]=>array("lorem", "ipsum"))ou dois-je créer cette fonction moi-même?
MaBi
11
Techniquement, PHP traiterait également ?key=lorem&key=ipsumcomme si vous ne fournissiez key=ipsumque si c'était la chaîne de requête sur l'URL. Et je pense qu'il est considéré comme invalide de réutiliser la clé et d'attendre des résultats cohérents ou que toutes les instances de la clé soient conservées. L'approche valide, au moins pour une chaîne de requête envoyée à PHP, serait ?key[]=lorem&key[]=ipsum, donc votre approche locale pourrait rechercher toutes les occurrences &{x}=où x se produit plus d'une fois et remplacer par x[](et traiter? Comme identique à &)
Anthony
9
@Mabi - oh, et regardez, quelqu'un d'autre est d'accord avec vous et a déjà créé sa propre fonction - php.net/manual/en/function.parse-str.php#76792
Anthony
C'était utile! J'ai décidé de le faire comme ça il y a ?key[]=lorem&key[]=ipsumquelques semaines. Mais merci de partager le lien!
MaBi
2
Il faut faire attention aux chaînes qui incluent «+», comme [email protected]. Ceux-ci seront analysés par parse_str dans un espace. key = myemail [email protected].
dudeman
62

Parfois parse_str()seul la note est précise, elle pourrait afficher par exemple:

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

parse_str () renverrait:

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

Il serait préférable de combiner parse_str()avec parse_url()comme ça:

$url = "somepage?id=123&lang=gr&size=300";
parse_str( parse_url( $url, PHP_URL_QUERY), $array );
print_r( $array );
yassine2020
la source
3
Je suppose que c'est attendu$_SERVER['QUERY_STRING']
CpILL
comment créer un tableau en chaîne url ex. : Array ([somepage? Id] => 123 [lang] => gr [size] => 300) output = somepage? Id = 123 & lang = gr & size = 300
Mehul Velani
32

Utilisation parse_str().

$str = 'pg_id=2&parent_id=2&document&video';
parse_str($str, $arr);
print_r($arr);
Fusée Hazmat
la source
18

Utilisez http://us1.php.net/parse_str

Attention, son utilisation est:

parse_str($str, &$array);

ne pas

$array = parse_str($str);
Ionut Bajescu
la source
3
C'est `parse_str ($ str, $ arr);` et pas parse_str($str,&$arr);terrible erreur
17

Si vous rencontrez un problème pour convertir une chaîne de requête en tableau en raison de l'esperluette codée

&

alors assurez-vous d'utiliser html_entity_decode

Exemple:

// 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
la source
14

Il existe plusieurs méthodes possibles, mais pour vous, il existe déjà une fonction intégréeparse_str

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

Ceci est une ligne pour analyser la requête de l'URL actuelle dans le tableau:

parse_str($_SERVER['QUERY_STRING'], $query);
hovado
la source
1

Vous pouvez utiliser la fonction de chaîne PHP parse_str()suivie de foreachboucle.

$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);
Giacomo1968
la source
-3

Ceci est le code PHP pour diviser la requête dans mysql & 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;
}

Exemple:

Requête avant

sélectionnez xx à partir de xx sélectionnez xx, (sélectionnez xx) à partir de xx où y = 'cc' sélectionnez xx à partir de xx jointure gauche (sélectionnez xx) où (sélectionnez le premier xxx de xxx) oder par xxx desc ";

Requête après

sélectionnez xx à partir de xx

sélectionnez xx, (sélectionnez xx) à partir de xx où y = 'cc'

sélectionnez xx à partir de xx jointure gauche (sélectionnez xx) où (sélectionnez top 1 xxx à partir de xxx) ou par xxx desc

Merci, d'Indonésie Sentrapedagang.com

Dewa Putra
la source
-5

Pour cette question spécifique, la réponse choisie est correcte mais s'il y a un paramètre redondant - comme un "e" supplémentaire - dans l'URL, la fonction échouera silencieusement sans qu'une erreur ou une exception ne soit émise:

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

Je préfère donc utiliser mon propre analyseur comme ceci:

//$_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" } 

Maintenant que vous avez toutes les occurrences de chaque paramètre dans son propre tableau, vous pouvez toujours les fusionner en un seul tableau si vous le souhaitez.

J'espère que ça t'as aidé!

Nassim
la source
Vous ne devriez jamais avoir le même nom de paramètre de requête avec des valeurs différentes. Cela n'a pas de sens puisqu'une seule sera acceptée de toute façon.
Cristian
3
@Cristian: "Vous ne devriez jamais avoir le même nom de paramètre de requête avec des valeurs différentes." Vous avez raison, mais la réponse indique: "… l'URL de la fonction échouera silencieusement sans qu'une erreur ou une exception ne soit générée." Ce qui pourrait casser une application. Bien que cette réponse ne soit pas excellente, elle met en évidence un problème. Surtout si votre application peut être plantée par quelqu'un qui fait une demande arbitraire avec des paramètres supplémentaires.
Giacomo1968