クエリ文字列を配列に解析します


195

下の文字列を配列にするにはどうすればよいですか?

pg_id=2&parent_id=2&document&video 

これは私が探している配列です。

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

回答:


330

あなたは欲しいparse_str機能を、あなたは配列内の代わりに、個々の変数に入れたデータを持っている二番目のパラメータを設定する必要があります。

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

parse_str($get_string, $get_array);

print_r($get_array);

2
同じ答えを何度も使用すると機能しないため、この答えに問題があります(phpでは配列のキーが一意であるためです)。したがって、?key=lorem&key=ipsum結果はarray(["key"]=>"ipsum")s.thを取得する関数があります。このように、array(["key"]=>array("lorem", "ipsum"))または自分でこの関数を作成する必要がありますか?
MaBi

11
技術的には、PHPは、それがURLのクエリ文字列である?key=lorem&key=ipsum場合にのみ提供されたかのように扱いkey=ipsumます。また、キーを再利用して一貫した結果を期待すること、またはキーのすべてのインスタンスが保持されることは無効と見なされます。有効なアプローチは、少なくともPHPに送信されるクエリ文字列の場合はになる?key[]=lorem&key[]=ipsumため、&{x}=xが複数回出現する箇所を検索して 置き換えx[]ます(そして?を&と同じように処理します)
Anthony

9
@Mabi-ああ、そうです、誰か他の人があなたに同意し、すでに独自の関数を作成しています-php.net/manual/en/function.parse-str.php#76792
Anthony

それは役に立ちました!?key[]=lorem&key[]=ipsum数週間前にこのようにすることにしました。しかし、リンクを共有してくれてありがとう!
MaBi

2
myemail+alias@gmail.comのように、「+」を含む文字列に注意する必要があります。これらは、parse_strによってスペースに解析されます。key = myemail alias@gmail.com。
dudeman

61

場合によってparse_str()は、それだけでノートが正確である場合があります。たとえば、

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

parse_str()は次を返します:

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

これは、結合する方が良いだろうparse_str()parse_url()そうのように:

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

3
私はそれが期待していると思います $_SERVER['QUERY_STRING']
CpILL

文字列のURL exに配列する方法。:配列([somepage?id] => 123 [lang] => gr [size] => 300)出力= somepage?id = 123&lang = gr&size = 300
mehul



17

エンコードされたアンパサンドが原因でクエリ文字列を配列に変換できない場合

&

次に必ず使用してください html_entity_decode

例:

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

これは、現在のURLから配列にクエリを解析するための1行です:

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

1

ループがparse_str()続くPHP文字列関数を使用できforeachます。

$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

これは、mysqlおよびmssqlでクエリを分割するPHPコードです

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

例:

前にクエリ

select xx from xx select xx、(select xx)from xx where y = 'cc' select xx from xx left join(select xx)where(select top 1 xxx from xxx)oder by xxx desc ";

後のクエリ

xxからxxを選択

select xx、(select xx)from xx where y = 'cc'

xxからxxを選択します。左結合(select xx)を選択します。

インドネシアのSentrapedagang.comからありがとう


-5

この特定の質問では、選択された答えは正しいですが、URLに余分な「e」などの冗長パラメーターがある場合、エラーや例外がスローされることなく、関数は警告なしに失敗します。

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

だから私は自分のパーサーを次のように使用することを好みます:

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

これで、各パラメーターのすべてのオカレンスが独自の配列にあります。必要に応じて、それらを常に1つの配列にマージできます。

お役に立てば幸いです。


同じクエリパラメータ名に異なる値を指定しないでください。いずれにしても1つしか受け入れられないため、意味がありません。
クリスティアン2017

3
@クリスチャン:「同じクエリパラメータ名に異なる値を決して指定しないでください。」あなたは正しいですが、答えは、「エラーや例外がスローされることなく、関数が静かに失敗するURLです。」これはアプリケーションを壊す可能性があります。この回答は素晴らしいものではありませんが、問題を浮き彫りにします。特に、アプリケーションが追加の
パラメーターを
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.