Sorgu dizesini bir diziye ayrıştırma


195

Aşağıdaki bir dizeyi bir diziye nasıl dönüştürebilirim ?

pg_id=2&parent_id=2&document&video 

Bu aradığım dizi,

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

Yanıtlar:


330

parse_strİşlevi istiyorsunuz ve verilerin bağımsız değişkenler yerine bir diziye yerleştirilmesi için ikinci parametreyi ayarlamanız gerekir.

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

parse_str($get_string, $get_array);

print_r($get_array);

2
Aynı cevap birden çok kez (php dizi anahtarlarında benzersiz olduğundan) kullanırsanız çalışmaz, çünkü bu cevap ile ilgili bir sorun var. Böylece ?key=lorem&key=ipsumsonuç şu olacaktır array(["key"]=>"ipsum"), s.th. almak için bir işlevi var mı böyle array(["key"]=>array("lorem", "ipsum"))mi yoksa bu işlevi kendi başıma mı oluşturmak zorundayım?
MaBi

11
Teknik olarak PHP, ?key=lorem&key=ipsumyalnızca key=ipsumURL'deki sorgu dizesi olsaydı, size verilmiş gibi davranır . Ve anahtarı yeniden kullanmanın ve tutarlı sonuçlar beklemenin veya anahtarın tüm örneklerinin korunmasının geçersiz olduğunu düşünüyorum. En azından PHP'ye gönderilen bir sorgu dizesi için geçerli yaklaşım, ?key[]=lorem&key[]=ipsumbu nedenle, kendi yetiştirdiğiniz yaklaşımınız &{x}=x'in birden fazla oluştuğu ve yerine x[](ve? İle aynı şekilde davranıyorsa) yerine geçebilecek herhangi bir örneği arayabilir
Anthony

9
@Mabi - oh, bak, bir başkası seninle aynı fikirde ve kendi işlevlerini zaten yarattı - php.net/manual/en/function.parse-str.php#76792
Anthony

Bu yardımcı oldu! ?key[]=lorem&key[]=ipsumBirkaç hafta önce böyle yapmaya karar verdim . Ancak bağlantıyı paylaştığınız için teşekkürler!
MaBi

2
Dikkat edilmesi gereken bir şey, myemail+alias@gmail.com gibi '+' içeren dizelerdir. Bunlar parse_str tarafından bir boşluğa ayrıştırılacaktır. key = myemail alias@gmail.com.
dudeman

62

Bazen parse_str()tek başına not doğrudur, örneğin görüntülenebilir:

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

parse_str () şunu döndürür:

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

Birleştirmek daha iyi olurdu parse_str()ile parse_url()şöyle:

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

3
Sanırım bekliyor$_SERVER['QUERY_STRING']
CpILL

dizgi url nasıl dizilir ex. : Dizi ([somepage? İd] => 123 [lang] => gr [size] => 300) çıktı = somepage? İd = 123 & lang = gr & size = 300
mehul



17

Kodlanmış ve işaretleri nedeniyle bir sorgu dizesini diziye dönüştürürken sorun yaşıyorsanız

&

o zaman kullandığınızdan emin olun html_entity_decode

Misal:

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

Bu, sorguyu geçerli URL'den diziye ayrıştırmak için tek satırlıdır:

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

1

PHP string fonksiyonunu ve parse_str()ardından foreachloop'u kullanabilirsiniz.

$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

Bu mysql & mssql sorgu bölmek için PHP kodu

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

Misal:

Önce sorgula

xx'ten xx'i seçin xx'i seçin, (xx'i seçin) xx'ten y = 'cc' xx sol birleşiminden xx'i seçin (xx'i seçin) burada (xxx'ten ilk 1 xxx'i seçin veya xxx desc'e göre);

Sonra sorgula

xx'ten xx seçin

xx'i seçin, (xx'i seçin) xx'ten y = 'cc'

xx sol birleşimden xx seçin (xx seçin) (burada xxx'ten ilk 1 xxx seçin) veya xxx desc tarafından

Endonezya Sentrapedagang.com'dan teşekkür ederim


-5

Bu özel soru için seçilen cevap doğrudur, ancak URL'de fazladan bir "e" gibi bir yedek parametre varsa, işlev bir hata veya istisna atılmadan sessizce başarısız olur:

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

Bu yüzden kendi ayrıştırıcımı şöyle kullanmayı tercih ederim:

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

Şimdi her parametrenin kendi dizisindeki tüm oluşumlarına sahipsiniz, isterseniz bunları her zaman tek bir dizide birleştirebilirsiniz.

Umarım yardımcı olur!


Asla farklı değerlerle aynı sorgu parametresi adına sahip olmamalısınız. Sadece bir tanesi kabul edileceğinden mantıklı değil.
Cristian

3
@Cristian: “Asla farklı değerlerle aynı sorgu parametresi adına sahip olmamalısınız.” Haklısınız, ancak yanıt şöyle diyor: “… fonksiyonun bir hata veya istisna olmadan sessizce başarısız olacağı”. Hangi bir uygulama bozabilir. Bu cevap harika olmasa da bir konuyu vurgulamaktadır. Özellikle başvurunuz keyfi olarak atılan ekstra parametrelerle istekte bulunan biri tarafından kilitlenebilirse.
JakeGould
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.