Completed
Push — develop ( 8a0cb6...d5d9d0 )
by Tom
04:26
created

ArrayFunctions::columnOrder()   B

Complexity

Conditions 6
Paths 5

Size

Total Lines 32
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 32
rs 8.439
cc 6
eloc 19
nc 5
nop 2
1
<?php
2
/*
3
 * @author Tom Klingenberg <https://github.com/ktomk>
4
 */
5
6
namespace N98\Util;
7
8
class ArrayFunctions
9
{
10
    /**
11
     * Merge two arrays together.
12
     *
13
     * If an integer key exists in both arrays, the value from the second array
14
     * will be appended the the first array. If both values are arrays, they
15
     * are merged together, else the value of the second array overwrites the
16
     * one of the first array.
17
     *
18
     * @see http://packages.zendframework.com/docs/latest/manual/en/index.html#zend-stdlib
19
     * @param  array $a
20
     * @param  array $b
21
     * @return array
22
     */
23
    public static function mergeArrays(array $a, array $b)
24
    {
25
        foreach ($b as $key => $value) {
26
            if (array_key_exists($key, $a)) {
27
                if (is_int($key)) {
28
                    $a[] = $value;
29
                } elseif (is_array($value) && is_array($a[$key])) {
30
                    $a[$key] = self::mergeArrays($a[$key], $value);
31
                } else {
32
                    $a[$key] = $value;
33
                }
34
            } else {
35
                $a[$key] = $value;
36
            }
37
        }
38
39
        return $a;
40
    }
41
42
    /**
43
     * @param string[] $columns
44
     * @param array $table
45
     * @return array table with ordered columns
46
     */
47
    public static function columnOrderArrayTable(array $columns, array $table)
48
    {
49
        return array_map(function (array $array) use ($columns) {
50
            return self::columnOrder($columns, $array);
51
        }, $table);
52
    }
53
54
    /**
55
     * order array entries (named and numbered) of array by the columns given as string keys.
56
     *
57
     * non-existent columns default to numbered entries or if no numbered entries exists any longer, to null.
58
     *
59
     * entries in array that could not consume any column are put after the columns.
60
     *
61
     * @param string[] $columns
62
     * @param array $array
63
     * @return array
64
     */
65
    public static function columnOrder(array $columns, array $array)
66
    {
67
        if (!$columns) {
1 ignored issue
show
Bug Best Practice introduced by
The expression $columns of type string[] 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...
68
            return $array;
69
        }
70
71
        $keys = array_fill_keys($columns, null);
72
73
        $keyed = array_intersect_key($array, $keys);
74
75
        $arrayLeftover = array_diff_key($array, $keyed);
76
        $keysLeftover = array_diff_key($keys, $keyed);
77
78
        $target = array();
79
        if ($keysLeftover) {
1 ignored issue
show
Bug Best Practice introduced by
The expression $keysLeftover 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...
80
            foreach ($arrayLeftover as $key => $value) {
81
                if (is_string($key)) {
82
                    continue;
83
                }
84
                $target[key($keysLeftover)] = $value;
85
                unset($arrayLeftover[$key]);
86
                next($keysLeftover);
87
                if (null === key($keysLeftover)) {
88
                    break;
89
                }
90
            }
91
        }
92
93
        $result = array_merge($keys, $keyed, $keysLeftover, $target, $arrayLeftover);
94
95
        return $result;
96
    }
97
}
98