123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- <?php
- namespace GuzzleHttp\Psr7;
- final class Query
- {
-
- public static function parse($str, $urlEncoding = true)
- {
- $result = [];
- if ($str === '') {
- return $result;
- }
- if ($urlEncoding === true) {
- $decoder = function ($value) {
- return rawurldecode(str_replace('+', ' ', $value));
- };
- } elseif ($urlEncoding === PHP_QUERY_RFC3986) {
- $decoder = 'rawurldecode';
- } elseif ($urlEncoding === PHP_QUERY_RFC1738) {
- $decoder = 'urldecode';
- } else {
- $decoder = function ($str) {
- return $str;
- };
- }
- foreach (explode('&', $str) as $kvp) {
- $parts = explode('=', $kvp, 2);
- $key = $decoder($parts[0]);
- $value = isset($parts[1]) ? $decoder($parts[1]) : null;
- if (!isset($result[$key])) {
- $result[$key] = $value;
- } else {
- if (!is_array($result[$key])) {
- $result[$key] = [$result[$key]];
- }
- $result[$key][] = $value;
- }
- }
- return $result;
- }
-
- public static function build(array $params, $encoding = PHP_QUERY_RFC3986)
- {
- if (!$params) {
- return '';
- }
- if ($encoding === false) {
- $encoder = function ($str) {
- return $str;
- };
- } elseif ($encoding === PHP_QUERY_RFC3986) {
- $encoder = 'rawurlencode';
- } elseif ($encoding === PHP_QUERY_RFC1738) {
- $encoder = 'urlencode';
- } else {
- throw new \InvalidArgumentException('Invalid type');
- }
- $qs = '';
- foreach ($params as $k => $v) {
- $k = $encoder($k);
- if (!is_array($v)) {
- $qs .= $k;
- if ($v !== null) {
- $qs .= '=' . $encoder($v);
- }
- $qs .= '&';
- } else {
- foreach ($v as $vv) {
- $qs .= $k;
- if ($vv !== null) {
- $qs .= '=' . $encoder($vv);
- }
- $qs .= '&';
- }
- }
- }
- return $qs ? (string) substr($qs, 0, -1) : '';
- }
- }
|