Issues (172)

src/functions/iterable_unwind.php (3 issues)

Severity
1
<?php /** @noinspection PhpVariableVariableInspection */
2
3
declare(strict_types=1);
4
5
namespace Improved;
6
7
/**
8
 * Deconstruct an iterable property/item for each element. The result is one element for each item in the iterable
9
 * property.
10
 *
11
 * @param iterable        $iterable      Iterable holding arrays or objects
12
 * @param int|string      $column
13
 * @param int|string|null $mapKey        The name of a new property to hold the array index of the element
14
 * @param bool            $preserveKeys  Preserve the keys of the iterable (will result in duplicate keys)
15
 * @return \Generator
16
 */
17 15
function iterable_unwind(iterable $iterable, $column, $mapKey = null, bool $preserveKeys = false): \Generator
0 ignored issues
show
Function Improved\iterable_unwind() has parameter $iterable with no value type specified in iterable type iterable.
Loading history...
Function Improved\iterable_unwind() return type has no value type specified in iterable type Generator.
Loading history...
18
{
19 14
    $counter = 0;
20
21 14
    $setArray = function ($element, $value, $key) use ($column, $mapKey) {
0 ignored issues
show
Anonymous function should have native return typehint "array".
Loading history...
22 9
        return array_merge($element, [$column => $value], $mapKey === null ? [] : [$mapKey => $key]);
23 14
    };
24
25 14
    $setArrayAccess = function ($element, $value, $key) use ($column, $mapKey) {
26 2
        $copy = clone $element;
27
28 2
        $copy[$column] = $value;
29 2
        if ($mapKey !== null) {
30 1
            $copy[$mapKey] = $key;
31
        }
32
33 2
        return $copy;
34 14
    };
35
36 14
    $setObject = function ($element, $value, $key) use ($column, $mapKey) {
37 2
        $copy = clone $element;
38
39 2
        $copy->$column = $value;
40 2
        if ($mapKey !== null) {
41 1
            $copy->$mapKey = $key;
42
        }
43
44 2
        return $copy;
45 14
    };
46
47 14
    foreach ($iterable as $topKey => $element) {
48 13
        $set = null;
49 13
        $iterated = false;
50
51 13
        if (is_array($element)) {
52 9
            $value = $element[$column] ?? null;
53 9
            $set = $setArray;
54 4
        } elseif ($element instanceof \ArrayAccess) {
55 2
            $value = $element[$column] ?? null;
56 2
            $set = $setArrayAccess;
57 2
        } elseif (is_object($element) && !$element instanceof \DateTimeInterface) {
58 2
            $value = $element->$column ?? null;
59 2
            $set = $setObject;
60
        } else {
61
            $value = null;
62
        }
63
64 13
        if (!is_iterable($value) || $set === null) {
65 13
            yield ($preserveKeys ? $topKey : $counter++) => $element;
66 13
            continue;
67
        }
68
69 13
        foreach ($value as $key => $item) {
70 13
            $iterated = true;
71 13
            yield ($preserveKeys ? $topKey : $counter++) => $set($element, $item, $key);
72
        }
73
74 13
        if (!$iterated) {
75 13
            yield ($preserveKeys ? $topKey : $counter++) => $set($element, null, null);
76
        }
77
    }
78
}
79