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' =>
)
laukok
źródło

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);
Anthony
źródło
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 [email protected]. Zostaną one sparsowane przez parse_str do spacji. klucz = myemail [email protected].
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 );
yassine2020
źródło
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
31

Korzystanie parse_str().

$str = 'pg_id=2&parent_id=2&document&video';
parse_str($str, $arr);
print_r($arr);
Rakieta Hazmat
źródło
18

Użyj http://us1.php.net/parse_str

Uwaga, jego użycie to:

parse_str($str, &$array);

nie

$array = parse_str($str);
Ionut Bajescu
źródło
2
To `parse_str ($ str, $ arr);` i nie parse_str($str,&$arr);straszny błąd
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' =>
)
Casper Wilkes
źródło
14

Istnieje kilka możliwych metod, ale dla ciebie jest już wbudowana parse_strfunkcja

$array = array();
parse_str($string, $array);
var_dump($array);
KingCrunch
źródło
3

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

parse_str($_SERVER['QUERY_STRING'], $query);
hovado
źródło
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);
JakeGould
źródło
-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

Dewa Putra
źródło
-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!

Nassim
źródło
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