Completed
Push — master ( 455e1e...12b5c6 )
by Viacheslav
02:09
created

JsonProcessor   A

Complexity

Total Complexity 23

Size/Duplication

Total Lines 88
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 23
c 1
b 0
f 0
dl 0
loc 88
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
B getByPath() 0 24 6
D removeByPath() 0 34 9
C pushByPath() 0 24 8
1
<?php
2
3
namespace Swaggest\JsonDiff;
4
5
6
class JsonProcessor
7
{
8
    public static function pushByPath(&$holder, $path, $value)
9
    {
10
        $pathItems = explode('/', $path);
11
        if ('#' === $pathItems[0]) {
12
            array_shift($pathItems);
13
        }
14
        $ref = &$holder;
15
        while (null !== $key = array_shift($pathItems)) {
16
            if (is_string($key)) {
17
                $key = urldecode($key);
18
            }
19
            if ($ref instanceof \stdClass) {
20
                $ref = &$ref->$key;
21
            } elseif ($ref === null
22
                && !is_int($key)
23
                && false === filter_var($key, FILTER_VALIDATE_INT)
24
            ) {
25
                $ref = new \stdClass();
26
                $ref = &$ref->$key;
27
            } else {
28
                $ref = &$ref[$key];
29
            }
30
        }
31
        $ref = $value;
32
    }
33
34
    public static function getByPath(&$holder, $path)
35
    {
36
        $pathItems = explode('/', $path);
37
        if ('#' === $pathItems[0]) {
38
            array_shift($pathItems);
39
        }
40
        $ref = &$holder;
41
        while (null !== $key = array_shift($pathItems)) {
42
            $key = urldecode($key);
43
            if ($ref instanceof \stdClass) {
44
                if (property_exists($ref, $key)) {
45
                    $ref = &$ref->$key;
46
                } else {
47
                    throw new Exception('Key not found: ' . $key);
48
                }
49
            } else {
50
                if (array_key_exists($key, $ref)) {
51
                    $ref = &$ref[$key];
52
                } else {
53
                    throw new Exception('Key not found: ' . $key);
54
                }
55
            }
56
        }
57
        return $ref;
58
    }
59
60
    public static function removeByPath(&$holder, $path)
61
    {
62
        $pathItems = explode('/', $path);
63
        if ('#' === $pathItems[0]) {
64
            array_shift($pathItems);
65
        }
66
        $ref = &$holder;
67
        while (null !== $key = array_shift($pathItems)) {
68
            $parent = &$ref;
69
            $key = urldecode($key);
70
            $refKey = $key;
71
            if ($ref instanceof \stdClass) {
72
                if (property_exists($ref, $key)) {
73
                    $ref = &$ref->$key;
74
                } else {
75
                    throw new Exception('Key not found: ' . $key);
76
                }
77
            } else {
78
                if (array_key_exists($key, $ref)) {
79
                    $ref = &$ref[$key];
80
                } else {
81
                    throw new Exception('Key not found: ' . $key);
82
                }
83
            }
84
        }
85
86
        if (isset($parent) && isset($refKey)) {
87
            if ($parent instanceof \stdClass) {
88
                unset($parent->$refKey);
89
            } else {
90
                unset($parent[$refKey]);
91
            }
92
        }
93
        return $ref;
94
    }
95
}