Blame view

vendor/hranicka/csv/src/Writer.php 2.08 KB
fcd9278e   Mihail   parser csv v1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
  <?php
  
  namespace Hranicka\Csv;
  
  class Writer
  {
  
  	/** @var string */
  	private $filePath;
  
  	/** @var array */
  	private $data;
  
  	/** @var bool */
  	private $hasHeaderRow;
  
  	/** @var string */
  	private $delimiter;
  
  	/** @var string */
  	private $enclosure;
  
  	/** @var resource */
  	private $handler;
  
  	/**
  	 * @param string $filePath CSV file path
  	 * @param array $data
  	 * @param bool $hasHeaderRow Is the first row header?
  	 */
  	public function __construct($filePath, array $data, $hasHeaderRow = TRUE)
  	{
  		$this->filePath = $filePath;
  		$this->data = $data;
  		$this->hasHeaderRow = $hasHeaderRow;
  
  		$this->setup();
  	}
  
  	/**
  	 * @param string $delimiter
  	 * @param string $enclosure
  	 * @return $this
  	 */
  	public function setup($delimiter = ',', $enclosure = '"')
  	{
  		$this->delimiter = $delimiter;
  		$this->enclosure = $enclosure;
  
  		return $this;
  	}
  
  	/**
  	 * @return array
  	 * @throws InvalidFileException
  	 */
  	public function write()
  	{
  		$this->openHandler();
  
  		$line = 0;
  		$keys = NULL;
  
  		foreach ($this->data as $row) {
  			$line++;
  
  			if ($this->hasHeaderRow) {
  				if ($keys === NULL) {
  					$keys = array_keys($row);
  					$this->writeRow($keys);
  				}
  
  				$values = array_values($row);
  				if (count($keys) !== count($values)) {
  					throw new InvalidFileException("Invalid columns detected on line #$line.");
  				}
  			}
  
  			$this->writeRow(array_values($row));
  		}
  
  		$this->closeHandler();
  	}
  
  	private function openHandler()
  	{
  		$this->handler = fopen($this->filePath, 'w');
  		if ($this->handler === FALSE) {
  			throw new InvalidFileException('Cannot open the file.');
  		}
  	}
  
  	private function closeHandler()
  	{
  		fclose($this->handler);
  		$this->handler = NULL;
  	}
  
  	/**
  	 * @param array $data
  	 * @return int
  	 */
  	private function writeRow(array $data)
  	{
  		return fputcsv($this->handler, $this->convertTypes($data), $this->delimiter, $this->enclosure);
  	}
  
  	/**
  	 * @param array $data
  	 * @return array
  	 */
  	private function convertTypes(array $data)
  	{
  		foreach ($data as & $value) {
  			if (is_array($value)) {
  				$value = json_encode($value);
  			}
  
  			$value = (string)$value;
  		}
  
  		return $data;
  	}
  
  }