Loader::mergeArrays()   B
last analyzed

Complexity

Conditions 5
Paths 6

Size

Total Lines 15
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 10
nc 6
nop 3
dl 0
loc 15
rs 8.8571
c 0
b 0
f 0
1
<?php
2
3
namespace Sinergi\Config;
4
5
use Sinergi\Config\Loader\LoaderInterface;
6
use Sinergi\Config\Loader\YamlLoader;
7
use Sinergi\Config\Path\PathCollection;
8
use Sinergi\Config\Loader\PhpLoader;
9
10
class Loader
11
{
12
    protected static $loaders = [
13
        PhpLoader::EXTENSION => PhpLoader::class,
14
        YamlLoader::EXTENSION => YamlLoader::class,
15
    ];
16
17
    /**
18
     * @param PathCollection $paths
19
     * @param string $env
20
     * @param string $file
21
     * @return array
22
     */
23
    public static function load(PathCollection $paths, $env, $file)
24
    {
25
        $retval = [];
26
        foreach ($paths as $path) {
27
            $array1 = self::loadFile($path, null, $file);
28
            $array2 = self::loadFile($path, $env, $file);
29
            $retval = self::mergeArrays($retval, $array1, $array2);
30
        }
31
        return $retval;
32
    }
33
34
    /**
35
     * @param string $path
36
     * @param string $env
37
     * @param string $file
38
     * @return array
39
     */
40
    public static function loadFile($path, $env, $file)
41
    {
42
        $retval = [];
43
        foreach (self::$loaders as $fileType => $loader) {
44
            $file = "{$file}.{$fileType}";
45
46
            if ($env) {
47
                $path = $path . DIRECTORY_SEPARATOR . $env . DIRECTORY_SEPARATOR . $file;
48
            } else {
49
                $path = $path . DIRECTORY_SEPARATOR . $file;
50
            }
51
52
            if (file_exists($path)) {
53
                if (is_string($loader)) {
54
                    $loader = self::$loaders[$fileType] = new $loader;
55
                }
56
                if ($loader instanceof LoaderInterface) {
57
                    $retval = $loader::load($path);
58
                    if (!is_array($retval)) {
59
                        $retval = [];
60
                    }
61
                }
62
            }
63
        }
64
        return $retval;
65
    }
66
67
    /**
68
     * @param array $array1
69
     * @param array $array2
70
     * @param array $array3
71
     * @return array
72
     */
73
    public static function mergeArrays(array $array1, array $array2, array $array3 = null)
74
    {
75
        $retval = $array1;
76
        foreach ($array2 as $key => $value) {
77
            if (is_array($value) && isset($retval[$key])) {
78
                $retval[$key] = self::mergeArrays($retval[$key], $value);
79
            } else {
80
                $retval[$key] = $value;
81
            }
82
        }
83
        if (null !== $array3) {
84
            $retval = self::mergeArrays($retval, $array3);
85
        }
86
        return $retval;
87
    }
88
}
89