将查询字符串解析为数组


195

如何将下面的字符串转换为数组

pg_id=2&parent_id=2&document&video 

这是我要寻找的阵列,

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

Answers:


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'3

11
从技术上讲,PHP也会?key=lorem&key=ipsum像您仅key=ipsum在URL上的查询字符串那样提供。而且我认为重用密钥并获得一致的结果或保留密钥的所有实例被认为是无效的。至少对于发送到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 2015年

2
需要注意的是包含'+'的字符串,例如myemail+alias@gmail.com。这些将由parse_str解析为一个空格。key = myemail alias@gmail.com。
dudeman '16

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例如。:数组([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' =>
)

14

有几种可能的方法,但是对您来说,已经有一个内置parse_str函数

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

3

这是将查询从当前URL解析为数组的一类代码:

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

1

您可以使用PHP字符串函数parse_str()后跟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;
}

例:

之前查询

从xx中选择xx,从xx中选择xx,(从xx中选择xx),其中y ='cc'从xx左连接中选择xx(选择xx),其中(从xxx中选择前1个xxx)由xxx desc进行;

查询后

从xx中选择xx

选择xx,(从xx中选择xx),其中y ='cc'

从xx左联接中选择xx(选择xx)其中(从xxx中选择前1个xxx)由xxx desc排序

谢谢来自印度尼西亚的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" } 

现在,每个参数的所有出现都位于其自己的数组中,如果需要,您始终可以将它们合并到一个数组中。

希望有帮助!


您绝不能使用相同的查询参数名称和不同的值。这是没有意义的,因为无论如何只能接受一个。
克里斯蒂安

3
@Cristian:“您永远不应使用相同的查询参数名称,而使用不同的值。” 您是正确的,但是答案指出:“ ...该函数的URL将无提示失败,而不会引发错误或异常。” 这可能会破坏应用程序。虽然这个答案不是很好,但确实突出了一个问题。尤其是如果您的应用程序可能由于只是随意发出带有附加参数的请求而崩溃的话
。– JakeGould
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.