Passed
Push — master ( 49cff2...fe21a0 )
by Sven
05:29
created

ArrayUtils::hasKeysByType()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 11
rs 9.2
c 0
b 0
f 0
cc 4
eloc 7
nc 4
nop 4
1
<?php
2
namespace Bedd\Common;
3
4
use Bedd\Common\Traits\StaticClassTrait;
5
6
/**
7
 * ArrayUtils
8
 */
9
class ArrayUtils
10
{
11
    use StaticClassTrait;
12
13
    /**
14
     * Test whether an array contains one or more keys by defined $type
15
     *
16
     * @param string $input the Type: string|int
17
     * @param array $input
18
     * @param bool $only
19
     * @param bool $allow_empty Should an empty $input return true
20
     * @return bool
21
     */
22
    private static function hasKeysByType($type, array $input, $only = false, $allow_empty = false)
23
    {
24
        if (!is_array($input)) {
25
          return false;
26
        }
27
        if (!$input) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $input of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
28
          return $allow_empty;
29
        }
30
        $count = count(array_filter(array_keys($input), 'is_'.strtolower($type)));
31
        return  $only ? $count === count($input) : $count > 0;
32
    }
33
    /**
34
     * Test whether an array contains one or more string keys
35
     *
36
     * @param array $input
37
     * @param bool $only
38
     * @param bool $allow_empty Should an empty $input return true
39
     * @return bool
40
     */
41
    public static function hasStringKeys(array $input, $only = false, $allow_empty = false)
42
    {
43
        return self::hasKeysByType('string', $input, $only, $allow_empty);
44
    }
45
46
    /**
47
     * Test whether an array contains one or more integer keys
48
     *
49
     * @param array $input
50
     * @param bool $only
51
     * @param bool $allow_empty Should an empty $input return true
52
     * @return bool
53
     */
54
    public static function hasIntegerKeys(array $input, $only = false, $allow_empty = false)
55
    {
56
        return self::hasKeysByType('int', $input, $only, $allow_empty);
57
    }
58
59
    /**
60
     * Returns the value of the first found key-name
61
     *
62
     * @param array $input
63
     * @param string[] $keys
64
     * @param mixed $default
65
     * @return mixed
66
     */
67
    public static function findValueByKeys(array $input, array $keys, $default = null)
68
    {
69
        $return = $default;
70
        foreach ($keys as $key) {
71
            if (isset($input[$key])) {
72
                $return = $input[$key];
73
                break;
74
            }
75
        }
76
        return $return;
77
    }
78
79
    /**
80
     * Flatten a multi-dimensional aray into a one dimensional array
81
     *
82
     * @param array $input
83
     * @param string $preserve_keys
84
     * @return array
85
     */
86
    public static function flatten(array $input, $preserve_keys = false)
87
    {
88
        $return = [];
89
        $awr_func = $preserve_keys ?
90
            function ($v, $k) use (&$return) {$return[$k] = $v;} :
0 ignored issues
show
Coding Style introduced by
Opening brace must be the last content on the line
Loading history...
91
            function ($v) use (&$return) {$return[] = $v;}
0 ignored issues
show
Coding Style introduced by
Opening brace must be the last content on the line
Loading history...
92
        ;
93
        array_walk_recursive($input, $awr_func);
94
        return $return;
95
    }
96
97
    /**
98
     * Rename a key inside a dimensional array
99
     *
100
     * @param array $input
101
     * @param string old_key
102
     * @param string new_key
103
     * @return array
104
     */
105
    public static function renameKey(array $input, $old_key, $new_key)
106
    {
107
        $ret = $input;
108
        if ($old_key !== $new_key && array_key_exists($old_key, $input)) {
109
            $keys = array_keys($input);
110
            $offset = array_search($old_key, $keys);
111
            $keys[$offset] = $new_key;
112
            $ret = array_combine($keys, $input);
113
        }
114
        return $ret;
115
    }
116
}
117