Subversion Repositories php-qbpwcf

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3 liveuser 1
<?php
2
 
3
namespace GuzzleHttp\Psr7;
4
 
5
final class Query
6
{
7
    /**
8
     * Parse a query string into an associative array.
9
     *
10
     * If multiple values are found for the same key, the value of that key
11
     * value pair will become an array. This function does not parse nested
12
     * PHP style arrays into an associative array (e.g., `foo[a]=1&foo[b]=2`
13
     * will be parsed into `['foo[a]' => '1', 'foo[b]' => '2'])`.
14
     *
15
     * @param string   $str         Query string to parse
16
     * @param int|bool $urlEncoding How the query string is encoded
17
     *
18
     * @return array
19
     */
20
    public static function parse($str, $urlEncoding = true)
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('+', ' ', $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) { return $str; };
38
        }
39
 
40
        foreach (explode('&', $str) as $kvp) {
41
            $parts = explode('=', $kvp, 2);
42
            $key = $decoder($parts[0]);
43
            $value = isset($parts[1]) ? $decoder($parts[1]) : null;
44
            if (!isset($result[$key])) {
45
                $result[$key] = $value;
46
            } else {
47
                if (!is_array($result[$key])) {
48
                    $result[$key] = [$result[$key]];
49
                }
50
                $result[$key][] = $value;
51
            }
52
        }
53
 
54
        return $result;
55
    }
56
 
57
    /**
58
     * Build a query string from an array of key value pairs.
59
     *
60
     * This function can use the return value of `parse()` to build a query
61
     * string. This function does not modify the provided keys when an array is
62
     * encountered (like `http_build_query()` would).
63
     *
64
     * @param array     $params   Query string parameters.
65
     * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986
66
     *                            to encode using RFC3986, or PHP_QUERY_RFC1738
67
     *                            to encode using RFC1738.
68
     * @return string
69
     */
70
    public static function build(array $params, $encoding = PHP_QUERY_RFC3986)
71
    {
72
        if (!$params) {
73
            return '';
74
        }
75
 
76
        if ($encoding === false) {
77
            $encoder = function ($str) { return $str; };
78
        } elseif ($encoding === PHP_QUERY_RFC3986) {
79
            $encoder = 'rawurlencode';
80
        } elseif ($encoding === PHP_QUERY_RFC1738) {
81
            $encoder = 'urlencode';
82
        } else {
83
            throw new \InvalidArgumentException('Invalid type');
84
        }
85
 
86
        $qs = '';
87
        foreach ($params as $k => $v) {
88
            $k = $encoder($k);
89
            if (!is_array($v)) {
90
                $qs .= $k;
91
                if ($v !== null) {
92
                    $qs .= '=' . $encoder($v);
93
                }
94
                $qs .= '&';
95
            } else {
96
                foreach ($v as $vv) {
97
                    $qs .= $k;
98
                    if ($vv !== null) {
99
                        $qs .= '=' . $encoder($vv);
100
                    }
101
                    $qs .= '&';
102
                }
103
            }
104
        }
105
 
106
        return $qs ? (string) substr($qs, 0, -1) : '';
107
    }
108
}