6
6
7
7
use App \Entity \City ;
8
8
9
+ /**
10
+ * Class CityDataRepository
11
+ * @package App\Repository\City
12
+ */
9
13
final class CityDataRepository implements CityDataInterface
10
14
{
11
15
private const DATA_SOURCE = 'worldcities.csv ' ;
12
16
private const FIELDS_COUNT = 11 ;
17
+ private $ filter ;
18
+ private $ order ;
13
19
14
20
/**
15
21
* @return array<int, City>
@@ -37,6 +43,47 @@ public function getFromCsv(): array
37
43
throw new \RuntimeException (sprintf ('Invalid data at row: %d ' , count ($ row )));
38
44
}
39
45
46
+ if ($ this ->filter ) {
47
+ foreach ($ this ->filter as $ key => $ filter ) {
48
+ switch ($ key ) {
49
+ case "city " :
50
+ $ rowId = 0 ;
51
+ break ;
52
+ case "city_ascii " :
53
+ $ rowId = 1 ;
54
+ break ;
55
+ case "lat " :
56
+ $ rowId = 2 ;
57
+ break ;
58
+ case "lng " :
59
+ $ rowId = 3 ;
60
+ break ;
61
+ case "country " :
62
+ $ rowId = 4 ;
63
+ break ;
64
+ case "iso2 " :
65
+ $ rowId = 5 ;
66
+ break ;
67
+ case "iso3 " :
68
+ $ rowId = 6 ;
69
+ break ;
70
+ case "admin_name " :
71
+ $ rowId = 7 ;
72
+ break ;
73
+ case "capital " :
74
+ $ rowId = 8 ;
75
+ break ;
76
+ case "population " :
77
+ $ rowId = 9 ;
78
+ break ;
79
+ }
80
+ }
81
+ $ city = strtolower ($ row [$ rowId ]);
82
+ if (strpos ($ city , $ filter ) === false ) {
83
+ continue ;
84
+ }
85
+ }
86
+
40
87
$ city = new City (
41
88
$ cpt - 1 ,
42
89
$ this ->sanitize ($ row [0 ] ?? '' ),
@@ -54,6 +101,23 @@ public function getFromCsv(): array
54
101
$ cities [$ cpt - 1 ] = $ city ;
55
102
}
56
103
104
+ if ($ this ->order ) {
105
+ foreach ($ this ->order as $ key => $ order )
106
+ {
107
+ usort ($ cities , function ($ a , $ b ) use ($ key , $ order ) {
108
+ $ getMethod = 'get ' . ucfirst ($ key );
109
+ if ($ a ->{$ getMethod }() === $ b ->{$ getMethod }()) {
110
+ return 0 ;
111
+ }
112
+ if ($ order === 'desc ' ) {
113
+ return ($ a ->{$ getMethod }() < $ b ->{$ getMethod }());
114
+ } else {
115
+ return ($ a ->{$ getMethod }() > $ b ->{$ getMethod }());
116
+ }
117
+ });
118
+ }
119
+ }
120
+
57
121
return $ cities ?? [];
58
122
}
59
123
@@ -74,8 +138,50 @@ private function getFileAsArray(): array
74
138
return $ file ;
75
139
}
76
140
141
+ /**
142
+ * @param string|null $str
143
+ * @return string
144
+ */
77
145
private function sanitize (?string $ str ): string
78
146
{
79
147
return trim (utf8_encode ((string ) $ str ));
80
148
}
149
+
150
+ /**
151
+ * @return string|null
152
+ */
153
+ public function getFilter (): ?string
154
+ {
155
+ return $ this ->filter ;
156
+ }
157
+
158
+ /**
159
+ * @param array $filter
160
+ * @return $this
161
+ */
162
+ public function setFilter (array $ filter ): CityDataRepository
163
+ {
164
+ $ this ->filter = $ filter ;
165
+
166
+ return $ this ;
167
+ }
168
+
169
+ /**
170
+ * @return string|null
171
+ */
172
+ public function getOrder (): ?string
173
+ {
174
+ return $ this ->order ;
175
+ }
176
+
177
+ /**
178
+ * @param array $order
179
+ * @return $this
180
+ */
181
+ public function setOrder (array $ order ): CityDataRepository
182
+ {
183
+ $ this ->order = $ order ;
184
+
185
+ return $ this ;
186
+ }
81
187
}
0 commit comments