Completed
Push — master ( 5c74fa...a4f811 )
by Arnold
02:37
created

iterable_to_array()   B

Complexity

Conditions 8
Paths 8

Size

Total Lines 23
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 8

Importance

Changes 0
Metric Value
cc 8
eloc 15
nc 8
nop 2
dl 0
loc 23
ccs 11
cts 11
cp 1
crap 8
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
29
        default:
30
            // @codeCoverageIgnoreStart
31
            $type = get_type_description($iterable);
32
            throw new \InvalidArgumentException("Unknown iterable: $type");
33
            // @codeCoverageIgnoreEnd
34
    }
35
36 12
    return $preserveKeys === false ? array_values($iterable) : $iterable;
37
}
38