Parsuj ciąg zapytania w tablicy


195

Jak mogę zamienić ciąg poniżej w tablicę ?

pg_id=2&parent_id=2&document&video 

To jest tablica, której szukam,

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

Odpowiedzi:


330

Chcesz tę parse_strfunkcję i musisz ustawić drugi parametr, aby dane były umieszczane w tablicy zamiast w poszczególnych zmiennych.

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

parse_str($get_string, $get_array);

print_r($get_array);

2
Mam problem z tą odpowiedzią, ponieważ nie działa, jeśli użyjesz tego samego klucza wiele razy (tak, ponieważ w tablicy php klucze są unikalne). W ?key=lorem&key=ipsumrezultacie powstanie array(["key"]=>"ipsum")pytanie: czy istnieje funkcja pozwalająca uzyskać s.th. lubię to, array(["key"]=>array("lorem", "ipsum"))czy muszę samodzielnie utworzyć tę funkcję?
MaBi

11
Technicznie PHP potraktowałoby to ?key=lorem&key=ipsumtak, jakbyś podał tylko, key=ipsumjeśli byłby to ciąg zapytania w adresie URL. I myślę, że ponowne użycie klucza i uznanie za spójne wyniki lub że wszystkie wystąpienia klucza zostaną zachowane, jest uważane za nieprawidłowe. Prawidłowe podejście, przynajmniej dla ciągu zapytania wysłanego do PHP, byłoby takie ?key[]=lorem&key[]=ipsum, więc twoje własne podejście może szukać wszelkich przypadków, w &{x}=których x występuje więcej niż jeden raz i zastąpić x[](i traktować? Tak samo jak &)
Anthony

9
@Mabi - och, i popatrz, ktoś inny się z tobą zgadza i już stworzył własną funkcję - php.net/manual/en/function.parse-str.php#76792
Anthony

To było pomocne! ?key[]=lorem&key[]=ipsumKilka tygodni temu postanowiłem zrobić to w ten sposób . Ale dziękuję za udostępnienie linku!
MaBi

2
Należy uważać na ciągi zawierające „+”, takie jak myemail+alias@gmail.com. Zostaną one sparsowane przez parse_str do spacji. klucz = myemail alias@gmail.com.
dudeman

61

Czasami parse_str()sam jest dokładny, może wyświetlać na przykład:

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

parse_str () zwróci:

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

Lepiej byłoby połączyć parse_str()z parse_url():

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

3
Chyba się spodziewa$_SERVER['QUERY_STRING']
CpILL,

jak tablica na ciąg URL ur. : Array ([somepage? Id] => 123 [lang] => gr [size] => 300) output = somepage? Id = 123 & lang = gr & size = 300
mehul



17

Jeśli masz problem z konwersją ciągu zapytania na tablicę z powodu zakodowanych znaków ampersands

&

następnie użyj html_entity_decode

Przykład:

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

Jest to jeden wiersz dla parsowania zapytania z bieżącego adresu URL do tablicy:

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

1

Możesz użyć funkcji łańcuchowej PHP, parse_str()a następnie foreachpętli.

$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

To jest kod PHP do dzielenia zapytania w mysql i 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;
}

Przykład:

Zapytanie wcześniej

wybierz xx od xx wybierz xx, (wybierz xx) od xx gdzie y = 'cc' wybierz xx od xx lewy dołącz (wybierz xx) gdzie (wybierz top 1 xxx od xxx) lub oder przez xxx desc ";

Zapytanie po

wybierz xx z xx

wybierz xx, (wybierz xx) z xx gdzie y = „cc”

wybierz xx od xx lewe dołącz (wybierz xx) gdzie (wybierz top 1 xxx od xxx) lub oder przez xxx desc

Dziękuję, z Indonezji Sentrapedagang.com


-5

W przypadku tego konkretnego pytania wybrana odpowiedź jest prawidłowa, ale jeśli w adresie URL znajduje się nadmiarowy parametr - taki jak dodatkowe „e” - funkcja po cichu zawiedzie bez zgłoszenia błędu lub wyjątku:

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

Wolę więc używać własnego parsera:

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

Teraz masz wszystkie wystąpienia każdego parametru we własnej tablicy, zawsze możesz je scalić w jedną tablicę, jeśli chcesz.

Mam nadzieję, że to pomaga!


Nigdy nie powinieneś mieć tej samej nazwy parametru zapytania o różnych wartościach. To nie ma sensu, ponieważ tylko jeden zostanie zaakceptowany.
Cristian,

3
@Cristian: „Nigdy nie powinieneś mieć tej samej nazwy parametru zapytania o różnych wartościach.” Masz rację, ale odpowiedź brzmi: „… URL, który funkcja po cichu zawiedzie bez zgłoszenia błędu lub wyjątku”. Co może zepsuć aplikację. Chociaż ta odpowiedź nie jest świetna, uwypukla problem. Zwłaszcza jeśli twoja aplikacja może zostać zawieszona przez kogoś, kto po prostu samowolnie
zgłasza
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.