Analizar cadena de consulta en una matriz

195

¿Cómo puedo convertir una cadena de abajo en una matriz ?

pg_id=2&parent_id=2&document&video 

Esta es la matriz que estoy buscando,

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

Respuestas:

330

Desea la parse_strfunción y necesita establecer el segundo parámetro para que los datos se coloquen en una matriz en lugar de en variables individuales.

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

parse_str($get_string, $get_array);

print_r($get_array);
Antonio
fuente
2
Tengo un problema con esta respuesta, porque no funciona si usa la misma clave varias veces (sí, porque en php array las claves son únicas). Entonces ?key=lorem&key=ipsumresultará en array(["key"]=>"ipsum")La pregunta es, ¿hay una función para obtener algo? como esto array(["key"]=>array("lorem", "ipsum"))o tengo que crear esta función por mi cuenta?
MaBi
11
Técnicamente, PHP también trataría ?key=lorem&key=ipsumcomo si solo proporcionara key=ipsumsi esa fuera la cadena de consulta en la URL. Y creo que se considera inválido reutilizar la clave y esperar resultados consistentes o que todas las instancias de la clave se conserven. El enfoque válido, al menos para una cadena de consulta enviada a PHP, sería ?key[]=lorem&key[]=ipsum, por lo que su enfoque local podría buscar cualquier ocurrencia de &{x}=donde x ocurra más de una vez y reemplazar con x[](y tratando? Igual que &)
Anthony
9
@Mabi - ah, y mira, alguien más está de acuerdo contigo y ya creó su propia función - php.net/manual/en/function.parse-str.php#76792
Anthony
Eso fue útil! Decidí hacerlo así ?key[]=lorem&key[]=ipsumhace algunas semanas. Pero gracias por compartir el enlace!
MaBi
2
Algo a tener en cuenta son las cadenas que incluyen '+', como [email protected]. Estos serán analizados por parse_str a un espacio. clave = myemail [email protected].
dudeman
61

A veces parse_str()solo es una nota precisa, podría mostrar, por ejemplo:

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

parse_str () devolvería:

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

Sería mejor para combinar parse_str()con parse_url()este modo:

$url = "somepage?id=123&lang=gr&size=300";
parse_str( parse_url( $url, PHP_URL_QUERY), $array );
print_r( $array );
yassine2020
fuente
3
Supongo que está esperando$_SERVER['QUERY_STRING']
CpILL
cómo hacer una matriz para url de cadena ej. : Array ([somepage? Id] => 123 [lang] => gr [size] => 300) output = somepage? Id = 123 & lang = gr & size = 300
mehul
31

Utilizando parse_str().

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

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

Atención, su uso es:

parse_str($str, &$array);

no

$array = parse_str($str);
Ionut Bajescu
fuente
2
Es `parse_str ($ str, $ arr);` y no es parse_str($str,&$arr);un error terrible
17

Si tiene problemas para convertir una cadena de consulta en una matriz debido a los símbolos codificados

&

entonces asegúrese de usar html_entity_decode

Ejemplo:

// 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
fuente
14

Existen varios métodos posibles, pero para usted, ya hay una parse_strfunción integrada

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

Esta es una línea para analizar la consulta de la URL actual en la matriz:

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

Puede usar la función de cadena PHP parse_str()seguida de foreachloop.

$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
fuente
-3

Este es el código PHP para dividir consultas en mysql y 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;
}

Ejemplo:

Consulta antes

seleccione xx de xx seleccione xx, (seleccione xx) de xx donde y = 'cc' seleccione xx de xx combinación izquierda (seleccione xx) donde (seleccione la parte superior 1 xxx de xxx) oder por xxx desc ";

Consulta después

seleccione xx de xx

seleccione xx, (seleccione xx) de xx donde y = 'cc'

seleccione xx desde xx combinación izquierda (seleccione xx) donde (seleccione 1 xxx superior desde xxx) oder por xxx desc

Gracias, desde Indonesia Sentrapedagang.com

Dewa Putra
fuente
-5

Para esta pregunta específica, la respuesta elegida es correcta, pero si hay un parámetro redundante, como una "e" adicional, en la URL, la función fallará silenciosamente sin que se produzca un error o una excepción:

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

Así que prefiero usar mi propio analizador así:

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

Ahora que tiene todas las apariciones de cada parámetro en su propia matriz, siempre puede fusionarlas en una matriz si lo desea.

¡Espero que ayude!

Nassim
fuente
Nunca debe tener el mismo nombre de parámetro de consulta con valores diferentes. No tiene sentido ya que solo uno será aceptado de todos modos.
Cristian
3
@Cristian: "Nunca debe tener el mismo nombre de parámetro de consulta con valores diferentes". Tiene razón, pero la respuesta dice: "... la URL de la función fallará silenciosamente sin que se produzca un error o una excepción". Lo que podría romper una aplicación. Si bien esta respuesta no es excelente, resalta un problema. Especialmente si su aplicación puede ser bloqueada por alguien que hace una solicitud arbitrariamente con parámetros adicionales.
JakeGould