将查询字符串解析为数组

233

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

pg_id=2&parent_id=2&document&video 

这就是我在寻找的数组,

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

1
parse_str()的文档解释不够清楚。[这里更好些] (https://stackoverflow.com/questions/53792310/parse-str-need-someting-on-php7/53792394#53792394)(我加重了语气):*“如果没有第二个参数传递给parse_str(),查询字符串参数会填充本地符号表。考虑到安全问题,现在已经废弃了使用没有第二个参数的parse_str()。”* - Peter Mortensen
12个回答

390
你需要使用parse_str函数,并且需要将第二个参数设置为将数据放入一个数组而不是单独的变量中。
$queryString = "pg_id=2&parent_id=2&document&video";
 
parse_str($queryString, $queryArray);

print_r($queryArray);

2
我对这个答案有问题,因为如果您多次使用相同的键,则它不起作用(是的,因为在php中数组键是唯一的)。 因此,?key=lorem&key=ipsum将导致array(["key"]=>"ipsum")。 问题是,是否有一个函数可以获得类似于array(["key"]=>array("lorem", "ipsum"))的东西,还是我必须自己创建此函数? - MaBi
11
如果 URL 查询字符串上有 ?key=lorem&key=ipsum,从技术上讲 PHP 也会将其视为只提供了 key=ipsum。我认为重用关键字并期望保留所有关键字的结果是无效的。对于发送给 PHP 的查询字符串,有效的方法至少是 ?key[]=lorem&key[]=ipsum。因此,你的自定义方法可能会查找任何出现多次的 &{x}=(其中 x 出现两次及以上),并将其替换为 x[] (将 ? 视为与 & 相同)。 - Anthony
9
嗨,@Mabi - 看,有人同意你的观点并已经创建了自己的函数 - http://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
显示剩余2条评论

74
有时候仅使用parse_str()是不准确的,例如可能会显示如下内容:

Sometimes parse_str() alone is note accurate, it could display for example:

$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 例如: Array(     [somepage?id] => 123     [lang] => gr     [size] => 300 ) 输出= somepage?id = 123&lang = gr&size = 300 - Mehul Velani

37

使用parse_str()函数。

$str = 'pg_id=2&parent_id=2&document&video';
parse_str($str, $arr);
print_r($arr);

也许可以加一些关于 parse_str 某些用法被弃用的内容?(但是不要包含“编辑:”,“更新:”或类似的内容——答案应该看起来像是今天写的)。 - Peter Mortensen

22
如果你因为编码的&符号而无法将查询字符串转换成数组,请尝试这样做:
&

如果您需要解码HTML实体,请务必使用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' =>
)

1
这是非常关键的,需要去除不必要的 &。 - mintedsky

20
使用https://www.php.net/parse_str
注意,它的用法是:
parse_str($str, &$array);


$array = parse_str($str);

请注意,上述内容仅适用于PHP 5.3及更早版本。在PHP 5.4中,已经移除了按引用传递的调用时间。

3
“parse_str($str,$arr);”是正确的写法,而不是“parse_str($str,&$arr);”,这是一个可怕的错误。 - user8241064
那是 "&$arr" 和 "$arr" (& 的区别)。 - Peter Mortensen
@user8241064:那不就是形式参数吗?(是的,你已经离开了房间,但也许其他人可以加入讨论?) - Peter Mortensen
@pushrbx:对于 PHP 的后续版本(或所有版本),目前并不清楚应该使用什么。你好像在暗示后续版本的 PHP 不需要任何东西(这可能不是你的意思)。你能否澄清一下?最好先在评论中进行讨论,然后再提出其他编辑建议。 - Peter Mortensen
@PeterMortensen 我进行了编辑,假设读者知道“按引用传递调用时间”是什么意思,并且已经被删除。我的意思是,在未来的PHP版本中,正确的语法应该是parse_str($str, $array);而不是parse_str($str, &$array);。此外,根据SO指南,我认为这个信息应该在那里。 - pushrbx

19

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

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

也许可以加一些关于 parse_str 某些用法被弃用的内容?(但是不要包含“编辑:”,“更新:”或类似的内容——答案应该看起来像是今天写的)。 - Peter Mortensen

6

这是一行代码,用于将当前URL中的查询解析为数组:

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

3
你可以尝试这段代码:
<?php
    $str = "pg_id=2&parent_id=2&document&video";
    $array = array();
    parse_str($str, $array);
    print_r($array);
?>

输出:

Array
(
    [pg_id] => 2
    [parent_id] => 2
    [document] =>
    [video] =>
)

需要解释一下。例如,什么是想法/要点?请通过编辑(更改)您的答案进行回复,而不是在评论中(不带“编辑:”,“更新:”或类似内容 - 答案应该看起来像今天写的)。 - Peter Mortensen

1

但是PHP已经内置了$_GET函数,它会自动将其转换为数组。

尝试print_r($_GET),您将获得相同的结果。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接