Completed
Branch refactor/164-removeoldcollecti... (7c1123)
by Luke
05:38
created

TabularCollection::getRow()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 2
dl 0
loc 4
rs 10
c 0
b 0
f 0
ccs 0
cts 2
cp 0
crap 2
1
<?php
2
/**
3
 * CSVelte: Slender, elegant CSV for PHP
4
 *
5
 * Inspired by Python's CSV module and Frictionless Data and the W3C's CSV
6
 * standardization efforts, CSVelte was written in an effort to take all the
7
 * suck out of working with CSV.
8
 *
9
 * @version   v${CSVELTE_DEV_VERSION}
10
 * @copyright Copyright (c) 2016 Luke Visinoni <[email protected]>
11
 * @author    Luke Visinoni <[email protected]>
12
 * @license   https://github.com/deni-zen/csvelte/blob/master/LICENSE The MIT License (MIT)
13
 */
14
namespace CSVelte\Collection;
15
16
use BadMethodCallException;
17
use OutOfBoundsException;
18
use function CSVelte\is_traversable;
19
use function CSVelte\collect;
20
21
class TabularCollection extends MultiCollection
22
{
23
    /**
24
     * Is input data structure valid?
25
     *
26
     * In order to determine whether a given data structure is valid for a
27
     * particular collection type (tabular, numeric, etc.), we have this method.
28
     *
29
     * @param mixed $data The data structure to check
30
     * @return boolean True if data structure is tabular
31
     */
32 40
    protected function isConsistentDataStructure($data)
33
    {
34 40
        return static::isTabular($data);
35
    }
36
37
    /**
38
     * Does this collection have specified column?
39
     *
40
     * @param mixed $column The column index
41
     * @return bool
42
     */
43 8
    public function hasColumn($column)
44
    {
45
        try {
46 8
            $this->getColumn($column);
47 8
            return true;
48 1
        } catch (OutOfBoundsException $e) {
49 1
            return false;
50
        }
51
    }
52
53
    /**
54
     * Get column as collection
55
     *
56
     * @param mixed $column The column index
57
     * @param bool $throw Throw an exception on failure
58
     * @return AbstractCollection|false
59
     */
60
    public function getColumn($column, $throw = true)
61
    {
62 9
        $values = array_column($this->data, $column);
63 9
        if (count($values)) {
64 9
            return static::factory($values);
65
        }
66 1
        if ($throw) {
67 1
            throw new OutOfBoundsException(__CLASS__ . " could not find column: " . $column);
68
        }
69
        return false;
70
    }
71
72
    /**
73
     * Does this collection have a row at specified index?
74
     *
75
     * @param int $offset The column index
76
     * @return bool
77
     */
78
    public function hasRow($offset)
79
    {
80
        try {
81
            $this->getRow($offset);
82
            return true;
83
        } catch (OutOfBoundsException $e) {
84
            return false;
85
        }
86
    }
87
88
    /**
89
     * Get row at specified index.
90
     *
91
     * @param int $offset The row offset (starts from 0)
92
     * @param bool $throw Whether or not to throw an exception if row does not exist
93
     *
94
     * @return AbstractCollection|false
95
     */
96
    public function getRow($offset, $throw = true)
0 ignored issues
show
Unused Code introduced by
The parameter $throw is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
97
    {
98
        return $this->getValueAtPosition($offset);
99
    }
100
101
    /**
102
     * @inheritdoc
103
     */
104 1
    public function map(callable $callback)
105
    {
106 1
        $ret = [];
107 1
        foreach ($this->data as $key => $row) {
108 1
            $ret[$key] = $callback(static::factory($row));
109 1
        }
110 1
        return static::factory($ret);
111
    }
112
113
    /**
114
     * @inheritdoc
115
     */
116 21
    public function walk(callable $callback, $extraContext = null)
117
    {
118 21
        foreach ($this as $offset => $row) {
119 21
            $callback(static::factory($row), $offset, $extraContext);
120 21
        }
121 21
        return $this;
122
    }
123
124
//    public function average($column)
0 ignored issues
show
Unused Code Comprehensibility introduced by
53% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
125
//    {
126
//        $coll = $this->getColumnAsCollection($column);
127
//        return $coll->sum() / $coll->count();
128
//    }
129
//
130
//    public function mode($column)
131
//    {
132
//        return $this->getColumnAsCollection($column)->mode();
133
//    }
134
//
135
//    public function sum($column)
136
//    {
137
//        return $this->getColumnAsCollection($column)->sum();
138
//    }
139
//
140
//    public function median($column)
141
//    {
142
//        return $this->getColumnAsCollection($column)->median();
143
//    }
144
//
145
//    protected function getColumnAsCollection($column)
146
//    {
147
//        return static::factory(array_column($this->data, $column));
148
//    }
149
150
    /**
151
     * Magic method call
152
     *
153
     * @param string $method The name of the method
154
     * @param array $args The argument list
155
     *
156
     * @throws BadMethodCallException If no method exists
157
     *
158
     * @return mixed
159
     *
160
     * @todo Add phpdoc comments for dynamic methods
161
     * @todo throw BadMethodCallException
162
     */
163 8
    public function __call($method, $args)
164
    {
165 8
        $argc = count($args);
166 8
        if ($argc == 1 && $this->hasColumn($index = array_pop($args))) {
167 7
            $column = $this->getColumn($index);
168 7
            if (method_exists($column, $method)) {
169 7
                return call_user_func_array([$column, $method], $args);
170
            }
171
        }
172 1
        throw new BadMethodCallException("Method does not exist: " . __CLASS__ . "::{$method}()");
173
    }
174
}