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' =>
)

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

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 myemail+alias@gmail.com. Estos serán analizados por parse_str a un espacio. clave = myemail alias@gmail.com.
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 );

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



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' =>
)


3

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

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

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

-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


-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!


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.