将查询字符串转换为关联数组

30
在PHP中,我需要一个将URL查询字符串(比如:http://example.com?key1=value1&key2=value2)转换为PHP关联数组的函数:array ['key1' => 'value1', 'key2' => 'value2']
我已经想出了以下的代码。它可以工作,但我认为这段代码有点冗长。(并且在PHP中有内置函数可以处理所有事情:我很惊讶自己没有找到任何开箱即用的东西,类似于http_build_query的反向函数。)
你能否建议更好的方法来解决这个问题?
function getUrlParams($url) {
  $querystring = parse_url($url, PHP_URL_QUERY);
  $a = explode("&", $querystring);
  if (!(count($a) == 1 && $a[0] == "")) {
    foreach ($a as $key => $value) {
      $b = explode("=", $value);
      $a[$b[0]] = $b[1];
      unset ($a[$key]);
    }
    return $a;
  } else {
    return false;
  }
}

1
可能是将查询字符串解析为数组的重复问题。 - Simon East
5个回答

64

使用parse_url()可以仅从URL中获取属性。

获得属性后,您可以使用parse_str()将它们转换为变量。它也适用于多维数组!

$str = "first=value&arr[]=foo+bar&arr[]=baz";

parse_str($str, $output);
echo $output['first'];  // value
echo $output['arr'][0]; // foo bar
echo $output['arr'][1]; // baz

2
parse_str?函数名并不明确,但就是这样! - Nicolas Le Thierry d'Ennequin
3
parse_str并不总是理想的解决方案,因为包含点号(.)的查询字符串参数如user.name会被转换为user_name,因为PHP不支持包含点号的变量名。 - Mark
1
它只是将变量添加到您的作用域中?这似乎是一个不必要的安全问题。 - A F

3
如果您的意思是您所写的那样,那么很简单,不需要其他任何东西。在PHP中有一个预定义的超全局变量$_GET,它本身表示所有查询字符串作为键、值对关联数组。
例如:
// current page URI: http://localhost/test.php?key1=value1&key2=value2

echo '<pre>';
print_r($_GET);
echo '</pre>';

结果:

Array(
    [key1] = value1
    [key2] = value2
)

想要了解更多关于$_GET PHP超级全局变量的信息,请访问:http://php.net/manual/en/reserved.variables.get.php


0
$url = 'http://example.com?key1=value1&key2=value2&key3=value3';

preg_match_all('/\w+=.*/',$url,$matches);

parse_str($matches[0][0], $output);

print_r($output);

-2
foreach ($_GET as $key => $value) $arr["$key"]= $value;

6
在提供解决问题的代码时,最好也至少给出一个简短的解释,以便阅读的人不必逐行解析它来理解差异。 - Fluffeh
7
这样做有什么优势,相比于 $arr = $_GET 呢? - Dan Lugg

-3

尝试使用{{link1:parse_url}}


2
parse_url 不会从查询字符串中创建一个数组。它只是解析 URL 并将不同的部分作为字符串返回。 - Tim
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。 - pb2q
@pb2q 不,这并没有回答问题。 - ahnbizcad

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