source: vendor/guzzlehttp/psr7/src/Query.php

Last change on this file was e3d4e0a, checked in by Vlado 222039 <vlado.popovski@…>, 7 days ago

Upload project files

  • Property mode set to 100644
File size: 3.9 KB
RevLine 
[e3d4e0a]1<?php
2
3declare(strict_types=1);
4
5namespace GuzzleHttp\Psr7;
6
7final class Query
8{
9 /**
10 * Parse a query string into an associative array.
11 *
12 * If multiple values are found for the same key, the value of that key
13 * value pair will become an array. This function does not parse nested
14 * PHP style arrays into an associative array (e.g., `foo[a]=1&foo[b]=2`
15 * will be parsed into `['foo[a]' => '1', 'foo[b]' => '2'])`.
16 *
17 * @param string $str Query string to parse
18 * @param int|bool $urlEncoding How the query string is encoded
19 */
20 public static function parse(string $str, $urlEncoding = true): array
21 {
22 $result = [];
23
24 if ($str === '') {
25 return $result;
26 }
27
28 if ($urlEncoding === true) {
29 $decoder = function ($value) {
30 return rawurldecode(str_replace('+', ' ', (string) $value));
31 };
32 } elseif ($urlEncoding === PHP_QUERY_RFC3986) {
33 $decoder = 'rawurldecode';
34 } elseif ($urlEncoding === PHP_QUERY_RFC1738) {
35 $decoder = 'urldecode';
36 } else {
37 $decoder = function ($str) {
38 return $str;
39 };
40 }
41
42 foreach (explode('&', $str) as $kvp) {
43 $parts = explode('=', $kvp, 2);
44 $key = $decoder($parts[0]);
45 $value = isset($parts[1]) ? $decoder($parts[1]) : null;
46 if (!array_key_exists($key, $result)) {
47 $result[$key] = $value;
48 } else {
49 if (!is_array($result[$key])) {
50 $result[$key] = [$result[$key]];
51 }
52 $result[$key][] = $value;
53 }
54 }
55
56 return $result;
57 }
58
59 /**
60 * Build a query string from an array of key value pairs.
61 *
62 * This function can use the return value of `parse()` to build a query
63 * string. This function does not modify the provided keys when an array is
64 * encountered (like `http_build_query()` would).
65 *
66 * @param array $params Query string parameters.
67 * @param int|false $encoding Set to false to not encode,
68 * PHP_QUERY_RFC3986 to encode using
69 * RFC3986, or PHP_QUERY_RFC1738 to
70 * encode using RFC1738.
71 * @param bool $treatBoolsAsInts Set to true to encode as 0/1, and
72 * false as false/true.
73 */
74 public static function build(array $params, $encoding = PHP_QUERY_RFC3986, bool $treatBoolsAsInts = true): string
75 {
76 if (!$params) {
77 return '';
78 }
79
80 if ($encoding === false) {
81 $encoder = function (string $str): string {
82 return $str;
83 };
84 } elseif ($encoding === PHP_QUERY_RFC3986) {
85 $encoder = 'rawurlencode';
86 } elseif ($encoding === PHP_QUERY_RFC1738) {
87 $encoder = 'urlencode';
88 } else {
89 throw new \InvalidArgumentException('Invalid type');
90 }
91
92 $castBool = $treatBoolsAsInts ? static function ($v) { return (int) $v; } : static function ($v) { return $v ? 'true' : 'false'; };
93
94 $qs = '';
95 foreach ($params as $k => $v) {
96 $k = $encoder((string) $k);
97 if (!is_array($v)) {
98 $qs .= $k;
99 $v = is_bool($v) ? $castBool($v) : $v;
100 if ($v !== null) {
101 $qs .= '='.$encoder((string) $v);
102 }
103 $qs .= '&';
104 } else {
105 foreach ($v as $vv) {
106 $qs .= $k;
107 $vv = is_bool($vv) ? $castBool($vv) : $vv;
108 if ($vv !== null) {
109 $qs .= '='.$encoder((string) $vv);
110 }
111 $qs .= '&';
112 }
113 }
114 }
115
116 return $qs ? (string) substr($qs, 0, -1) : '';
117 }
118}
Note: See TracBrowser for help on using the repository browser.