File size: 3,354 Bytes
d2897cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
<?php

namespace Mautic\CoreBundle\Helper;

/**
 * Helper functions for simpler operations with arrays.
 */
class ArrayHelper
{
    /**
     * If the $key exists in the $origin array then it will return its value.
     *
     * @param mixed $key
     * @param mixed $defaultValue
     *
     * @return mixed
     */
    public static function getValue($key, array $origin, $defaultValue = null)
    {
        return array_key_exists($key, $origin) ? $origin[$key] : $defaultValue;
    }

    /**
     * If the $key exists in the $origin array then it will return its value
     * and unsets the $key from the $array.
     *
     * @param mixed $key
     * @param mixed $defaultValue
     *
     * @return mixed
     */
    public static function pickValue($key, array &$origin, $defaultValue = null)
    {
        $value = self::getValue($key, $origin, $defaultValue);

        unset($origin[$key]);

        return $value;
    }

    /**
     * Selects keys defined in the $keys array and returns array that contains only those.
     */
    public static function select(array $keys, array $origin): array
    {
        return array_filter($origin, fn ($value, $key): bool => in_array($key, $keys, true), ARRAY_FILTER_USE_BOTH);
    }

    /**
     * Sum between two array.
     *
     * @param mixed[] $a1
     * @param mixed[] $b2
     *
     * @return mixed[]
     */
    public static function sum(array $a1, array $b2): array
    {
        return self::sumOrSub($a1, $b2);
    }

    /**
     * SUBSTRACT between two array.
     */
    public static function sub(array $a1, array $b2): array
    {
        return self::sumOrSub($a1, $b2, true);
    }

    /**
     * Removes null and empty string values from the array.
     *
     * @param mixed[] $array
     *
     * @return mixed[]
     */
    public static function removeEmptyValues(array $array): array
    {
        return array_filter(
            $array,
            fn ($value): bool => !is_null($value) && '' !== $value
        );
    }

    /**
     * Flip array or sub arrays.
     *
     * @param array<int|string|array<int|string>> $masterArrays
     *
     * @return array<int|string|array<int|string>>
     */
    public static function flipArray(array $masterArrays): array
    {
        if (!is_array(end($masterArrays))) {
            return array_flip($masterArrays);
        }

        return array_map(
            fn (array $subArray) => array_flip($subArray),
            $masterArrays
        );
    }

    /**
     * @param array<mixed> $multidimensionalArray
     *
     * @return array<mixed>
     */
    public static function flatten(array $multidimensionalArray): array
    {
        $flattenedArray = [];

        array_walk_recursive(
            $multidimensionalArray,
            function ($value, $key) use (&$flattenedArray): void {
                $flattenedArray[$key] = $value;
            }
        );

        return $flattenedArray;
    }

    /**
     *  SUM/SUBSTRACT between two arrays.
     *
     * @param bool $subtracted
     */
    private static function sumOrSub(array $a1, array $b2, $subtracted = false): array
    {
        return array_map(function ($x, $y) use ($subtracted) {
            if ($subtracted) {
                return $x - $y;
            } else {
                return $x + $y;
            }
        }, $a1, $b2);
    }
}