Completed
Pull Request — master (#4)
by Laurens
02:47
created

Csv::removeHeaders()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 13
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
c 3
b 0
f 0
dl 0
loc 13
rs 9.4285
cc 3
eloc 7
nc 4
nop 4
1
<?php
2
namespace Werkspot\BingAdsApiBundle\Api\Helper;
3
4
use DateTime;
5
6
class Csv
7
{
8
    /**
9
     * @param array $lines
10
     * @param bool $includingColumnHeaders
11
     * @param int $fileHeaders
12
     * @param int $columnHeaders
13
     *
14
     * @return array
15
     */
16
    public function removeHeaders(array $lines, $includingColumnHeaders = true, $fileHeaders = 10, $columnHeaders = 1)
17
    {
18
        $lines = array_values($lines);
19
20
        $removeLines = ($includingColumnHeaders) ? ($fileHeaders + $columnHeaders) : $fileHeaders;
21
        for ($i = 0; $i < ($removeLines); ++$i) {
22
            unset($lines[$i]);
23
        }
24
25
        $lines = array_values($lines);
26
27
        return $lines;
28
    }
29
30
    /**
31
     * @param array $lines
32
     * @param int   $noOfLinesToRemove
33
     *
34
     * @return array
35
     */
36
    public function removeLastLines(array $lines, $noOfLinesToRemove = 1)
37
    {
38
        $totalLines = count($lines);
39
        $removeFrom = $totalLines - $noOfLinesToRemove;
40
41
        for ($i = $removeFrom; $i < $totalLines; ++$i) {
42
            unset($lines[$i]);
43
        }
44
45
        $lines = array_values($lines);
46
47
        return $lines;
48
    }
49
50
    /**
51
     * @param array $lines
52
     * @param string $separator
53
     * @param string $enclosure
54
     *
55
     * @return array
56
     */
57
    public function convertDateMDYtoYMD(array $lines, $separator = ',', $enclosure = '"')
58
    {
59
        foreach ($lines as $key => $line) {
60
            $columns = str_getcsv($line, $separator);
61
            $isChanged = false;
62
            foreach ($columns as $columnKey => $column) {
63
                if (preg_match('/^([1-9]|1[0-2])\/([1-9]|[1-2][0-9]|3[0-1])\/[0-9]{4}$/', $column)) {
64
                    $date = DateTime::createFromFormat('m/d/Y', $column);
65
                    $columns[$columnKey] = $date->format('Y/m/d');
66
                    $isChanged = true;
67
                }
68
            }
69
            if ($isChanged) {
70
                $lines[$key] = $this->arrayToCsvLine($columns, $separator, $enclosure);
71
            }
72
        }
73
74
        return $lines;
75
    }
76
77
    /**
78
     * @param array $array
79
     * @param string $separator
80
     * @param null|string $enclosure
81
     *
82
     * @return string
83
     */
84
    public function arrayToCsvLine(array $array, $separator = ',', $enclosure = null)
85
    {
86
        $csvStr = '';
87
88
        $length = count($array);
89
        for ($i = 0; $i < $length; ++$i) {
90
            if ($enclosure !== null) {
91
                $csvStr .= $enclosure . str_replace($enclosure, $enclosure . $enclosure, $array[$i]) . $enclosure;
92
            } else {
93
                $csvStr .= $array[$i];
94
            }
95
96
            $csvStr .= ($i < count($array) - 1) ? $separator : "\r\n";
97
        }
98
99
        return $csvStr;
100
    }
101
}
102