Proyectos de Subversion Moodle

Rev

Rev 1 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
 
3
declare(strict_types=1);
4
 
5
namespace GuzzleHttp\Psr7;
6
 
7
final 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
     *
1441 ariadna 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.
1 efrain 73
     */
1441 ariadna 74
    public static function build(array $params, $encoding = PHP_QUERY_RFC3986, bool $treatBoolsAsInts = true): string
1 efrain 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
 
1441 ariadna 92
        $castBool = $treatBoolsAsInts ? static function ($v) { return (int) $v; } : static function ($v) { return $v ? 'true' : 'false'; };
93
 
1 efrain 94
        $qs = '';
95
        foreach ($params as $k => $v) {
96
            $k = $encoder((string) $k);
97
            if (!is_array($v)) {
98
                $qs .= $k;
1441 ariadna 99
                $v = is_bool($v) ? $castBool($v) : $v;
1 efrain 100
                if ($v !== null) {
1441 ariadna 101
                    $qs .= '='.$encoder((string) $v);
1 efrain 102
                }
103
                $qs .= '&';
104
            } else {
105
                foreach ($v as $vv) {
106
                    $qs .= $k;
1441 ariadna 107
                    $vv = is_bool($vv) ? $castBool($vv) : $vv;
1 efrain 108
                    if ($vv !== null) {
1441 ariadna 109
                        $qs .= '='.$encoder((string) $vv);
1 efrain 110
                    }
111
                    $qs .= '&';
112
                }
113
            }
114
        }
115
 
116
        return $qs ? (string) substr($qs, 0, -1) : '';
117
    }
118
}