JsonEncoder::encode()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 7
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 5
nc 2
nop 2
1
<?php
2
3
namespace Edofre\Fullcalendar;
4
5
/**
6
 * Class JsonEncoder
7
 * Modified from
8
 * https://github.com/yiisoft/yii2/blob/master/framework/helpers/BaseJson.php
9
 * @package Edofre\Fullcalendar
10
 */
11
class JsonEncoder
12
{
13
    /**
14
     * @param     $value
15
     * @param int $options
16
     * @return string
17
     */
18
    public static function encode($value, $options = 0)
19
    {
20
        $expressions = [];
21
        $value = static::processData($value, $expressions, uniqid('', true));
22
        $json = json_encode($value, $options);
23
        return $expressions === [] ? $json : strtr($json, $expressions);
24
    }
25
26
    /**
27
     * @param $data
28
     * @param $expressions
29
     * @param $expPrefix
30
     * @return array|\stdClass|string
31
     */
32
    protected static function processData($data, &$expressions, $expPrefix)
33
    {
34
        if (is_object($data)) {
35
            if ($data instanceof JsExpression) {
36
                $token = "!{[$expPrefix=" . count($expressions) . ']}!';
37
                $expressions['"' . $token . '"'] = $data->expression;
38
                return $token;
39
            } else {
40
                $result = [];
41
                foreach ($data as $name => $value) {
42
                    $result[$name] = $value;
43
                }
44
                $data = $result;
45
            }
46
            if ($data === []) {
47
                return new \stdClass();
48
            }
49
        }
50
        if (is_array($data)) {
51
            foreach ($data as $key => $value) {
52
                if (is_array($value) || is_object($value)) {
53
                    $data[$key] = static::processData($value, $expressions, $expPrefix);
54
                }
55
            }
56
        }
57
        return $data;
58
    }
59
}