QueryParams::buildQueryArray()   A
last analyzed

Complexity

Conditions 2
Paths 1

Size

Total Lines 13
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 13
c 0
b 0
f 0
rs 9.4285
cc 2
eloc 7
nc 1
nop 2
1
<?php
2
3
namespace Amelia\Monzo\Util;
4
5
class QueryParams
6
{
7
    /**
8
     * The instance's query params.
9
     *
10
     * @var array
11
     */
12
    protected $params;
13
14
    /**
15
     * Make a new QueryParams instance.
16
     *
17
     * @param array $params
18
     */
19
    public function __construct(array $params)
20
    {
21
        $this->params = $params;
22
    }
23
24
    /**
25
     * Build a full query string working around {@see http_build_query()}'s flaws.
26
     *
27
     * @return string
28
     */
29
    public function build()
30
    {
31
        $params = collect($this->params)->map(function ($value, string $key) {
32
            return $this->buildQueryParams($value, $key);
33
        });
34
35
        return $params->implode('&');
36
    }
37
38
    /**
39
     * Build query params for the API.
40
     *
41
     * @param string|array|int $value
42
     * @param string $key
43
     * @return string
44
     */
45
    protected function buildQueryParams($value, string $key)
46
    {
47
        if (is_array($value)) {
48
            return $this->buildQueryArray($key, $value);
49
        }
50
51
        return rawurlencode($key) . '=' . rawurlencode($value);
52
    }
53
54
    /**
55
     * Build a query array. {@see http_build_query()} shows you why this is needed!
56
     *
57
     * @param string $name
58
     * @param array $value
59
     * @return string
60
     */
61
    protected function buildQueryArray(string $name, array $value)
62
    {
63
        $name = rawurlencode($name);
64
65
        return collect($value)->map(function ($value, $key) use ($name) {
66
            if (is_string($key)) {
67
                $key = rawurlencode($key);
68
69
                return "{$name}[$key]=" . rawurlencode($value);
70
            }
71
72
            return "{$name}[]=" . rawurlencode($value);
73
        })->implode('&');
74
    }
75
}
76