Analisar string de consulta em uma matriz


195

Como transformar uma string abaixo em uma matriz ?

pg_id=2&parent_id=2&document&video 

Esta é a matriz que estou procurando,

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

Respostas:


330

Você deseja a parse_strfunção e precisa definir o segundo parâmetro para que os dados sejam colocados em uma matriz em vez de em variáveis ​​individuais.

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

parse_str($get_string, $get_array);

print_r($get_array);

2
Eu tenho um problema com esta resposta, porque ela não funciona se você usar a mesma chave várias vezes (sim, porque as chaves da matriz php são únicas). Então ?key=lorem&key=ipsum, resultará em array(["key"]=>"ipsum")A questão é: existe uma função para obter s.th. assim array(["key"]=>array("lorem", "ipsum"))ou eu tenho que criar essa função por conta própria?
Mabi

11
Tecnicamente, o PHP também trataria ?key=lorem&key=ipsumcomo se você fornecesse apenas key=ipsumse essa fosse a string de consulta na URL. E acho que é considerado inválido reutilizar a chave e esperar resultados consistentes ou que todas as instâncias da chave sejam mantidas. A abordagem válida, pelo menos para uma string de consulta enviada ao PHP, seria ?key[]=lorem&key[]=ipsum, portanto, sua abordagem doméstica pode procurar por quaisquer ocorrências de &{x}=onde x ocorre mais de uma vez e substituir por x[](e tratando? O mesmo que &)
Anthony

9
@Mabi - oh, e olhar, alguém concorda com você e criaram a sua própria função já - php.net/manual/en/function.parse-str.php#76792
Anthony

Isso foi útil! Decicei fazê-lo assim ?key[]=lorem&key[]=ipsumhá algumas semanas. Mas obrigado por compartilhar o link!
Mabi

2
Algo a ser observado são as strings que incluem '+', como myemail+alias@gmail.com. Estes serão analisados ​​por parse_str para um espaço. key = myemail alias@gmail.com.
dudeman

61

Às vezes, por parse_str()si só, a nota é precisa, ela pode exibir, por exemplo:

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

parse_str () retornaria:

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

Seria melhor combinar parse_str()com parse_url()o seguinte:

$url = "somepage?id=123&lang=gr&size=300";
parse_str( parse_url( $url, PHP_URL_QUERY), $array );
print_r( $array );

3
Eu acho que ele está esperando$_SERVER['QUERY_STRING']
CpILL

como matriz para string url ex. : Array ([? Somepage id] => 123 [lang] => gr [size] => 300) output = somepage id = 123 & lang = gr & size = 300?
mehul



17

Se você estiver com problemas para converter uma string de consulta em uma matriz por causa de e comercial codificado

&

então não deixe de usar html_entity_decode

Exemplo:

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

14

Existem vários métodos possíveis, mas para você, já existe uma função internaparse_str

$array = array();
parse_str($string, $array);
var_dump($array);

3

Esta é uma linha para analisar a consulta do URL atual na matriz:

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

1

Você pode usar a função de string 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 é o código PHP para dividir a consulta no mysql e 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;
}

Exemplo:

Consulta antes

selecione xx de xx selecione xx, (selecione xx) de xx onde y = 'cc' selecione xx de xx junção esquerda (selecione xx) onde (selecione 1 xxx de xxx) ou mais por xxx desc ";

Consulta após

selecione xx de xx

selecione xx, (selecione xx) em xx, em que y = 'cc'

selecione xx de xx junção esquerda (selecione xx) onde (selecione 1 xxx de xxx) ou od por xxx desc

Obrigado, da Indonésia Sentrapedagang.com


-5

Para esta pergunta específica, a resposta escolhida está correta, mas se houver um parâmetro redundante - como um "e" extra - no URL, a função falhará silenciosamente, sem que ocorra um erro ou exceção:

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

Então, eu prefiro usar meu próprio analisador da seguinte forma:

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

Agora você tem todas as ocorrências de cada parâmetro em sua própria matriz, sempre pode mesclá-las em uma matriz, se desejar.

Espero que ajude!


Você nunca deve ter o mesmo nome de parâmetro de consulta com valores diferentes. Não faz sentido, pois apenas um será aceito de qualquer maneira.
Cristian

3
@ Christian: “Você nunca deve ter o mesmo nome de parâmetro de consulta com valores diferentes.” Você está correto, mas a resposta declara: "... a URL em que a função falhará silenciosamente sem que um erro ou exceção seja lançada". O que poderia quebrar um aplicativo. Embora essa resposta não seja ótima, ela destaca um problema. Especialmente se o seu aplicativo pode ser deixado de funcionar por alguém apenas arbitrariamente fazer uma solicitação com parâmetros extras jogados dentro.
JakeGould
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.