2
2
3
3
namespace Recca0120 \Twzipcode \Storages ;
4
4
5
- use Closure ;
6
5
use Recca0120 \Lodash \JArray ;
7
6
use Recca0120 \Lodash \JString ;
8
7
use Recca0120 \Twzipcode \Address ;
8
+ use Recca0120 \Twzipcode \Contracts \Source ;
9
9
use Recca0120 \Twzipcode \Contracts \Storage ;
10
10
use Recca0120 \Twzipcode \Rule ;
11
- use ZipArchive ;
12
11
13
12
class File implements Storage
14
13
{
@@ -50,36 +49,6 @@ public function zip3(Address $address)
50
49
return null ;
51
50
}
52
51
53
- /**
54
- * @param string $source
55
- * @return $this
56
- */
57
- public function load ($ source )
58
- {
59
- $ zip5 = [];
60
- $ zip3 = [];
61
- $ this ->each (
62
- $ this ->prepareSource ($ source ),
63
- function ($ zipcode , $ county , $ district , $ rules ) use (&$ zip5 , &$ zip3 ) {
64
- $ zip5 [$ zipcode ] = $ this ->compress (array_map (static function ($ rule ) {
65
- return new Rule ($ rule );
66
- }, $ rules ));
67
-
68
- if (empty ($ zip3 [$ county ])) {
69
- $ zip3 [$ county ] = substr ($ zipcode , 0 , 1 );
70
- }
71
-
72
- if (empty ($ zip3 [$ county .$ district ])) {
73
- $ zip3 [$ county .$ district ] = substr ($ zipcode , 0 , 3 );
74
- }
75
- });
76
-
77
- $ this ->store ('zip3 ' , $ zip3 );
78
- $ this ->store ('zip5 ' , $ zip5 );
79
-
80
- return $ this ;
81
- }
82
-
83
52
/**
84
53
* @param string $zip3
85
54
* @return JArray
@@ -94,27 +63,53 @@ public function rules($zip3)
94
63
}
95
64
96
65
/**
97
- * @param string $file
98
66
* @return $this
99
67
*/
100
- public function loadFile ( $ file = null )
68
+ public function flush ( )
101
69
{
102
- $ file = $ file ?: $ this ->path .'../Zip32_utf8_10501_1.csv ' ;
103
- $ this ->load ($ this ->getSource ($ file ));
70
+ static ::$ cached = ['zip3 ' => null , 'zip5 ' => null ];
104
71
105
72
return $ this ;
106
73
}
107
74
108
75
/**
76
+ * @param Source $source
109
77
* @return $this
110
78
*/
111
- public function flush ( )
79
+ public function load ( $ source )
112
80
{
113
- static ::$ cached = ['zip3 ' => null , 'zip5 ' => null ];
81
+ $ zip5 = [];
82
+ $ zip3 = [];
83
+ $ source ->each (function ($ zipcode , $ county , $ district , $ rules ) use (&$ zip5 , &$ zip3 ) {
84
+ $ zip5 [$ zipcode ] = $ this ->compress (array_map (static function ($ rule ) {
85
+ return new Rule ($ rule );
86
+ }, $ rules ));
87
+
88
+ if (empty ($ zip3 [$ county ])) {
89
+ $ zip3 [$ county ] = substr ($ zipcode , 0 , 1 );
90
+ }
91
+
92
+ if (empty ($ zip3 [$ county .$ district ])) {
93
+ $ zip3 [$ county .$ district ] = substr ($ zipcode , 0 , 3 );
94
+ }
95
+ });
96
+
97
+ $ this ->store ('zip3 ' , $ zip3 );
98
+ $ this ->store ('zip5 ' , $ zip5 );
114
99
115
100
return $ this ;
116
101
}
117
102
103
+ /**
104
+ * @param string $filename
105
+ * @param array $data
106
+ * @return void
107
+ */
108
+ private function store ($ filename , $ data )
109
+ {
110
+ file_put_contents ($ this ->path .$ filename .$ this ->suffix , $ this ->compress ($ data ));
111
+ }
112
+
118
113
/**
119
114
* @param string $filename
120
115
* @return void
@@ -134,63 +129,6 @@ private function restore($filename)
134
129
));
135
130
}
136
131
137
- /**
138
- * @param string $file
139
- * @return string
140
- */
141
- private function getSource ($ file )
142
- {
143
- $ extension = pathinfo ($ file , PATHINFO_EXTENSION );
144
-
145
- if ($ extension === 'zip ' ) {
146
- $ zip = new ZipArchive ;
147
- $ zip ->open ($ file );
148
- $ contents = $ zip ->getFromIndex (0 );
149
- $ zip ->close ();
150
- } else {
151
- $ contents = file_get_contents ($ file );
152
- }
153
-
154
- return $ contents ;
155
- }
156
-
157
- /**
158
- * @param string $source
159
- * @return array
160
- */
161
- private function prepareSource ($ source )
162
- {
163
- $ tricks = ['宜蘭縣壯圍鄉 ' => '263 ' , '新竹縣寶山鄉 ' => '308 ' , '臺南市新市區 ' => '744 ' ];
164
- $ results = [];
165
- $ rules = preg_split ('/\n|\r\n$/ ' , $ source );
166
- foreach ($ rules as $ rule ) {
167
- if (! empty (trim ($ rule ))) {
168
- list ($ zipcode , $ county , $ district ) = explode (', ' , $ rule );
169
- $ zip3 = ! empty ($ tricks [$ county .$ district ])
170
- ? $ tricks [$ county .$ district ]
171
- : substr ($ zipcode , 0 , 3 );
172
- $ results [$ county ][$ district ][$ zip3 ][] = $ rule ;
173
- }
174
- }
175
-
176
- return $ results ;
177
- }
178
-
179
- /**
180
- * @param array $ruleGroup
181
- * @param Closure $callback
182
- */
183
- private function each ($ ruleGroup , $ callback )
184
- {
185
- foreach ($ ruleGroup as $ county => $ districts ) {
186
- foreach ($ districts as $ district => $ addresses ) {
187
- foreach ($ addresses as $ zipcode => $ rule ) {
188
- $ callback ($ zipcode , $ county , $ district , $ rule );
189
- }
190
- }
191
- }
192
- }
193
-
194
132
/**
195
133
* @param array $array
196
134
* @return string
@@ -209,13 +147,5 @@ private function decompress($compressed)
209
147
return unserialize (gzuncompress ($ compressed ));
210
148
}
211
149
212
- /**
213
- * @param string $filename
214
- * @param array $data
215
- * @return void
216
- */
217
- private function store ($ filename , $ data )
218
- {
219
- file_put_contents ($ this ->path .$ filename .$ this ->suffix , $ this ->compress ($ data ));
220
- }
150
+
221
151
}
0 commit comments