Passed
Push — master ( 2303cb...ace980 )
by Arnold
02:37
created

iterable_to_array()   B

Complexity

Conditions 8
Paths 8

Size

Total Lines 20
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 8.0368

Importance

Changes 0
Metric Value
cc 8
eloc 15
nc 8
nop 2
dl 0
loc 20
ccs 11
cts 12
cp 0.9167
crap 8.0368
rs 8.4444
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Jasny;
6
7
/**
8
 * Convert any iterable to an array.
9
 *
10
 * @param array|\Traversable $iterable
11
 * @param bool|null          $preserveKeys  NULL means don't care
12
 * @return array
13
 */
14
function iterable_to_array(iterable $iterable, ?bool $preserveKeys = null): array
15
{
16
    switch (true) {
17 18
        case is_array($iterable):
18 3
            break;
19 15
        case is_object($iterable) && method_exists($iterable, 'toArray'):
20 3
            $iterable = $iterable->toArray();
21 3
            break;
22 12
        case is_object($iterable) && method_exists($iterable, 'getArrayCopy'):
23 6
            $iterable = $iterable->getArrayCopy();
24 6
            break;
25
26 6
        case $iterable instanceof \Traversable:
27 6
            return iterator_to_array($iterable, $preserveKeys === true);
28
        default:
29
            $type = get_type_description($iterable);
30
            throw new \InvalidArgumentException("Unknown iterable: $type"); // @codeCoverageIgnore
31
    }
32
33 12
    return $preserveKeys === false ? array_values($iterable) : $iterable;
34
}
35