Passed
Push — master ( 4f9909...e0cef8 )
by Smoren
02:35
created

TreeMaker::fromList()   A

Complexity

Conditions 4
Paths 6

Size

Total Lines 28
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 4

Importance

Changes 1
Bugs 1 Features 0
Metric Value
eloc 13
c 1
b 1
f 0
dl 0
loc 28
ccs 13
cts 13
cp 1
rs 9.8333
cc 4
nc 6
nop 4
crap 4
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Smoren\TreeTools;
6
7
use Smoren\TypeTools\MapAccess;
8
use ArrayAccess;
9
10
/**
11
 * @phpstan-type DictAccess = array<string, mixed>|ArrayAccess<string, mixed>|object
12
 */
13
class TreeMaker
14
{
15
    /**
16
     * @param iterable<array<string, mixed>> $list
17
     * @param string $idField
18
     * @param string $parentIdField
19
     * @param string $childrenContainerField
20
     *
21
     * @return array<array<string, mixed>>
22
     */
23 2
    public static function fromList(
24
        iterable $list,
25
        string $idField = 'id',
26
        string $parentIdField = 'parent_id',
27
        string $childrenContainerField = 'children'
28
    ): array {
29 2
        $result = [];
30
31 2
        $map = [];
32
33 2
        foreach($list as $item) {
34 1
            $item[$childrenContainerField] = [];
35 1
            $map[MapAccess::get($item, $idField)] = $item;
36
        }
37
38 2
        foreach($map as &$item) {
39 1
            if(isset($item[$parentIdField])) {
40 1
                $parentId = MapAccess::get($item, $parentIdField);
41
42
                /** @var array<mixed> $childrenContainer */
43 1
                $childrenContainer = &$map[$parentId][$childrenContainerField];
44 1
                $childrenContainer[] = &$item;
45
            } else {
46 1
                $result[] = &$item;
47
            }
48
        }
49
50 2
        return $result;
51
    }
52
}
53