Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
23 / 23
100.00% covered (success)
100.00%
7 / 7
CRAP
100.00% covered (success)
100.00%
1 / 1
AddressValues
100.00% covered (success)
100.00%
23 / 23
100.00% covered (success)
100.00%
7 / 7
8
100.00% covered (success)
100.00%
1 / 1
 getCommonRouteTypes
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
 getRouteTypes
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
2
 getDirections
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 getStates
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getStateCodes
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getStateNames
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getUnitTypes
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2/**
3 * Pop PHP Framework (https://www.popphp.org/)
4 *
5 * @link       https://github.com/popphp/popphp-framework
6 * @author     Nick Sagona, III <dev@noladev.com>
7 * @copyright  Copyright (c) 2009-2026 NOLA Interactive, LLC.
8 * @license    https://www.popphp.org/license     New BSD License
9 */
10
11/**
12 * @namespace
13 */
14namespace Pop\Parser\Address;
15
16/**
17 * Address values class
18 *
19 * @author     Mark Maher
20 * @copyright  Copyright (c) 2021
21 * @version    2.0.0
22 */
23class AddressValues
24{
25    /**
26     * A list of common route type designators provided by USPS
27     * @var array $commonRouteTypes
28     * */
29    protected static array $commonRouteTypes = [
30        "avenue", "boulevard", "circle", "drive", "highway", "lane", "park", "park drive", "park dr", "parkway drive",
31        "parkway dr", "parkway", "place", "place drive", "place dr", "road", "route", "square", "street", "terrace",
32        "trace", "ave", "av", "blvd", "boul", "cir", "dr", "hwy", "ln ", "pk", "pky", "pl", "rd", "rte", "sq", "st",
33        "terr", "trce",
34    ];
35
36    /**
37     * A list of route type designators provided by USPS
38     * @var array $routeTypes
39     * */
40    protected static array $routeTypes = [
41        "allee" => "aly","alley" => "aly","ally" => "aly","aly" => "aly","anex" => "anx","annex" => "anx",
42        "annx" => "anx","anx" => "anx","arc" => "arc","arcade" => "arc","bayoo" => "byu",
43        "bayou" => "byu","bch" => "bch","beach" => "bch","bend" => "bnd","bg" => "bg","bgs" => "bgs","blf" => "blf",
44        "blfs" => "blfs","bluf" => "blf","bluff" => "blf","bluffs" => "blfs","blvd" => "blvd","bnd" => "bnd",
45        "bot" => "btm","bottm" => "btm","bottom" => "btm",
46        "br" => "br","branch" => "br","brdge" => "brg","brg" => "brg","bridge" => "brg","brk" => "brk","brks" => "brks",
47        "brnch" => "br","brook" => "brk","brooks" => "brks","btm" => "btm","burg" => "bg","burgs" => "bgs",
48        "byp" => "byp","bypa" => "byp","bypas" => "byp","bypass" => "byp","byps" => "byp","byu" => "byu",
49        "camp" => "cp","canyn" => "cyn","canyon" => "cyn","cape" => "cpe","causeway" => "cswy","causway" => "cswy",
50        "cen" => "ctr","cent" => "ctr","center" => "ctr","centers" => "ctrs","centr" => "ctr","centre" => "ctr",
51        "ck" => "crk","clb" => "clb","clf" => "clf","clfs" => "clfs","cliff" => "clf","cliffs" => "clfs",
52        "club" => "clb","cmn" => "cmn","cmp" => "cp","cnter" => "ctr","cntr" => "ctr","cnyn" => "cyn",
53        "common" => "cmn","cor" => "cor","corner" => "cor","corners" => "cors","cors" => "cors","course" => "crse",
54        "court" => "ct","courts" => "cts","cove" => "cv","coves" => "cvs","cp" => "cp","cpe" => "cpe","cr" => "crk",
55        "crcl" => "cir","crcle" => "cir","crecent" => "cres","creek" => "crk","cres" => "cres","crescent" => "cres",
56        "cresent" => "cres","crest" => "crst","crk" => "crk","crossing" => "xing","crossroad" => "xrd",
57        "crscnt" => "cres","crse" => "crse","crsent" => "cres","crsnt" => "cres","crssing" => "xing","crssng" => "xing",
58        "crst" => "crst","crt" => "ct","cswy" => "cswy","ct" => "ct","ctr" => "ctr","ctrs" => "ctrs","cts" => "cts",
59        "curv" => "curv","curve" => "curv","cv" => "cv","cvs" => "cvs","cyn" => "cyn","dale" => "dl","dam" => "dm",
60        "div" => "dv","divide" => "dv","dl" => "dl","dm" => "dm","dv" => "dv","dvd" => "dv","est" => "est","estate" => "est",
61        "estates" => "ests","ests" => "ests","exp" => "expy","expr" => "expy","express" => "expy","expressway" => "expy",
62        "expw" => "expy","expy" => "expy","ext" => "ext","extension" => "ext","extensions" => "exts","extn" => "ext",
63        "extnsn" => "ext","exts" => "exts","falls" => "fls","ferry" => "fry","field" => "fld","fields" => "flds",
64        "flat" => "flt","flats" => "flts","fld" => "fld","flds" => "flds","fls" => "fls","flt" => "flt","flts" => "flts",
65        "ford" => "frd","fords" => "frds","forest" => "frst","forests" => "frst","forg" => "frg","forge" => "frg",
66        "forges" => "frgs","fork" => "frk","forks" => "frks","fort" => "ft","frd" => "frd","frds" => "frds",
67        "freeway" => "fwy","freewy" => "fwy","frg" => "frg","frgs" => "frgs","frk" => "frk","frks" => "frks",
68        "frry" => "fry","frst" => "frst","frt" => "ft","frway" => "fwy","frwy" => "fwy","fry" => "fry","ft" => "ft",
69        "fwy" => "fwy","garden" => "gdn","gardens" => "gdns","gardn" => "gdn","gateway" => "gtwy","gatewy" => "gtwy",
70        "gatway" => "gtwy","gdn" => "gdn","gdns" => "gdns","glen" => "gln","glens" => "glns","gln" => "gln",
71        "glns" => "glns","grden" => "gdn","grdn" => "gdn","grdns" => "gdns","green" => "grn","greens" => "grns",
72        "grn" => "grn","grns" => "grns","grov" => "grv","grove" => "grv","groves" => "grvs","grv" => "grv",
73        "grvs" => "grvs","gtway" => "gtwy","gtwy" => "gtwy","harb" => "hbr","harbor" => "hbr","harbors" => "hbrs",
74        "harbr" => "hbr","haven" => "hvn","havn" => "hvn","hbr" => "hbr","hbrs" => "hbrs","height" => "hts",
75        "heights" => "hts","hgts" => "hts","hill" => "hl","hills" => "hls",
76        "hiway" => "hwy","hiwy" => "hwy","hl" => "hl","hls" => "hls","hllw" => "holw","hollow" => "holw",
77        "hollows" => "holw","holw" => "holw","holws" => "holw","hrbor" => "hbr","ht" => "hts","hts" => "hts",
78        "hvn" => "hvn","hway" => "hwy","hwy" => "hwy","inlet" => "inlt","inlt" => "inlt","is" => "is","island" => "is",
79        "islands" => "iss","isle" => "isle","isles" => "isle","islnd" => "is","islnds" => "iss","iss" => "iss",
80        "jct" => "jct","jction" => "jct","jctn" => "jct","jctns" => "jcts","jcts" => "jcts","junction" => "jct",
81        "junctions" => "jcts","junctn" => "jct","juncton" => "jct","key" => "ky","keys" => "kys","knl" => "knl",
82        "knls" => "knls","knol" => "knl","knoll" => "knl","knolls" => "knls","ky" => "ky","kys" => "kys","la" => "ln",
83        "lake" => "lk","lakes" => "lks","landing" => "lndg","lck" => "lck",
84        "lcks" => "lcks","ldg" => "ldg","ldge" => "ldg","lf" => "lf","lgt" => "lgt","lgts" => "lgts","light" => "lgt",
85        "lights" => "lgts","lk" => "lk","lks" => "lks","ln" => "ln","lndg" => "lndg","lndng" => "lndg","loaf" => "lf",
86        "lock" => "lck","locks" => "lcks","lodg" => "ldg","lodge" => "ldg","loop" => "loop","loops" => "loop","manor" => "mnr",
87        "manors" => "mnrs","mdw" => "mdw","mdws" => "mdws","meadow" => "mdw","meadows" => "mdws","medows" => "mdws",
88        "mill" => "ml","mills" => "mls","mission" => "msn","missn" => "msn","ml" => "ml","mls" => "mls","mnr" => "mnr",
89        "mnrs" => "mnrs","mnt" => "mt","mntain" => "mtn","mntn" => "mtn","mntns" => "mtns","motorway" => "mtwy",
90        "mount" => "mt","mountain" => "mtn","mountains" => "mtns","mountin" => "mtn","msn" => "msn","mssn" => "msn",
91        "mt" => "mt","mtin" => "mtn","mtn" => "mtn","mtns" => "mtns","mtwy" => "mtwy","nck" => "nck","neck" => "nck",
92        "opas" => "opas","orch" => "orch","orchard" => "orch","orchrd" => "orch","oval" => "oval","overpass" => "opas",
93        "ovl" => "oval",
94        "pass" => "pass","passage" => "psge","path" => "path","paths" => "path","pike" => "pike","pikes" => "pike",
95        "pine" => "pne","pines" => "pnes","pk" => "park","plain" => "pln","plaines" => "plns","plains" => "plns",
96        "plaza" => "plz","pln" => "pln","plns" => "plns","plz" => "plz","plza" => "plz","pne" => "pne","pnes" => "pnes",
97        "point" => "pt","points" => "pts","port" => "prt","ports" => "prts","pr" => "pr","prairie" => "pr",
98        "prarie" => "pr","prk" => "park","prr" => "pr","prt" => "prt","prts" => "prts","psge" => "psge","pt" => "pt",
99        "pts" => "pts","rad" => "radl","radial" => "radl","radiel" => "radl","radl" => "radl","ranch" => "rnch",
100        "ranches" => "rnch","rapid" => "rpd","rapids" => "rpds","rd" => "rd","rdg" => "rdg","rdge" => "rdg",
101        "rdgs" => "rdgs","rds" => "rds","rest" => "rst","ridge" => "rdg","ridges" => "rdgs","riv" => "riv",
102        "river" => "riv","rivr" => "riv","rnch" => "rnch","rnchs" => "rnch","rpd" => "rpd","rpds" => "rpds",
103        "rst" => "rst","rte" => "rte","rvr" => "riv",
104        "row" => "row","shl" => "shl","shls" => "shls","shoal" => "shl","shoals" => "shls","shoar" => "shr",
105        "shoars" => "shrs","shore" => "shr","shores" => "shrs","shr" => "shr","shrs" => "shrs","skwy" => "skwy",
106        "skyway" => "skwy","smt" => "smt","spg" => "spg","spgs" => "spgs","spng" => "spg","spngs" => "spgs",
107        "spring" => "spg","springs" => "spgs","sprng" => "spg","sprngs" => "spgs","spur" => "spur","spurs" => "spur",
108        "sq" => "sq","sqr" => "sq","sqre" => "sq","sqrs" => "sqs","sqs" => "sqs","sta" => "sta","station" => "sta",
109        "statn" => "sta","stn" => "sta",
110        "str" => "st","stra" => "stra","strav" => "stra","strave" => "stra","straven" => "stra","stravenue" => "stra",
111        "stravn" => "stra","stream" => "strm","street" => "st","streets" => "sts","streme" => "strm","strm" => "strm",
112        "strt" => "st","strvn" => "stra","strvnue" => "stra","sts" => "sts","sumit" => "smt","sumitt" => "smt",
113        "summit" => "smt","throughway" => "trwy","tpk" => "tpke",
114        "tpke" => "tpke","tr" => "trl","track" => "trak","tracks" => "trak",
115        "trafficway" => "trfy","trail" => "trl","trails" => "trl","trak" => "trak","trce" => "trce","trfy" => "trfy",
116        "trk" => "trak","trks" => "trak","trl" => "trl","trls" => "trl","trnpk" => "tpke","trpk" => "tpke","trwy" => "trwy",
117        "tunel" => "tunl","tunl" => "tunl","tunls" => "tunl","tunnel" => "tunl","tunnels" => "tunl","tunnl" => "tunl",
118        "turnpike" => "tpke","turnpk" => "tpke","underpass" => "upas","un" => "un","union" => "un","unions" => "uns",
119        "uns" => "uns","upas" => "upas","valley" => "vly","valleys" => "vlys","vally" => "vly","vdct" => "via","via" => "via",
120        "viadct" => "via","viaduct" => "via","view" => "vw","views" => "vws","vill" => "vlg","villag" => "vlg",
121        "village" => "vlg","villages" => "vlgs","ville" => "vl","villg" => "vlg","villiage" => "vlg","vis" => "vis",
122        "vist" => "vis","vista" => "vis","vl" => "vl","vlg" => "vlg","vlgs" => "vlgs","vlly" => "vly","vly" => "vly",
123        "vlys" => "vlys","vst" => "vis","vsta" => "vis","vw" => "vw","vws" => "vws","walk" => "walk","walks" => "walk",
124        "way" => "way","well" => "wl","wells" => "wls","wl" => "wl","wls" => "wls","wy" => "way","xing" => "xing","xrd" => "xrd"
125    ];
126
127    /**
128     * A list of possible directional indicators
129     * @var array $directions
130     * */
131    protected static array $directions = [
132        'WSW'   => 'West-Southwest',
133        'ESE'   => 'East-Southeast',
134        'SSW'   => 'South-Southwest',
135        'SSE'   => 'South-Southeast',
136        'WNW'   => 'West-Northwest',
137        'ENE'   => 'East-Northeast',
138        'NNW'   => 'North-Northwest',
139        'NNE'   => 'North-Northeast',
140        'SW'    => 'Southwest',
141        'SE'    => 'Southeast',
142        'NW'    => 'Northwest',
143        'NE'    => 'Northeast',
144        ' N '   => 'North',
145        ' S '   => 'South',
146        ' E '   => 'East',
147        ' W '   => 'West',
148        'N.'    => 'North',
149        'S.'    => 'South',
150        'E.'    => 'East',
151        'W.'    => 'West',
152    ];
153
154    /**
155     * A list of states and state codes
156     * @var array $states
157     * */
158    protected static array $states = [
159        'US' => [
160            'AL' => 'Alabama',
161            'AK' => 'Alaska',
162            'AZ' => 'Arizona',
163            'AR' => 'Arkansas',
164            'CA' => 'California',
165            'CO' => 'Colorado',
166            'CT' => 'Connecticut',
167            'DE' => 'Delaware',
168            'DC' => 'District of Columbia',
169            'FL' => 'Florida',
170            'GA' => 'Georgia',
171            'HI' => 'Hawaii',
172            'ID' => 'Idaho',
173            'IL' => 'Illinois',
174            'IN' => 'Indiana',
175            'IA' => 'Iowa',
176            'KS' => 'Kansas',
177            'KY' => 'Kentucky',
178            'LA' => 'Louisiana',
179            'ME' => 'Maine',
180            'MD' => 'Maryland',
181            'MA' => 'Massachusetts',
182            'MI' => 'Michigan',
183            'MN' => 'Minnesota',
184            'MS' => 'Mississippi',
185            'MO' => 'Missouri',
186            'MT' => 'Montana',
187            'NE' => 'Nebraska',
188            'NV' => 'Nevada',
189            'NH' => 'New Hampshire',
190            'NJ' => 'New Jersey',
191            'NM' => 'New Mexico',
192            'NY' => 'New York',
193            'NC' => 'North Carolina',
194            'ND' => 'North Dakota',
195            'OH' => 'Ohio',
196            'OK' => 'Oklahoma',
197            'OR' => 'Oregon',
198            'PA' => 'Pennsylvania',
199            'PR' => 'Puerto Rico',
200            'RI' => 'Rhode Island',
201            'SC' => 'South Carolina',
202            'SD' => 'South Dakota',
203            'TN' => 'Tennessee',
204            'TX' => 'Texas',
205            'UT' => 'Utah',
206            'VT' => 'Vermont',
207            'VA' => 'Virginia',
208            'WA' => 'Washington',
209            'WV' => 'West Virginia',
210            'WI' => 'Wisconsin',
211            'WY' => 'Wyoming',
212        ],
213        'CA' => [
214            'AB' => 'Alberta',
215            'BC' => 'British Columbia',
216            'MB' => 'Manitoba',
217            'NB' => 'New Brunswick',
218            'NL' => 'Newfoundland and Labrador',
219            'NT' => 'Northwest Territories',
220            'NS' => 'Nova Scotia',
221            'NU' => 'Nunavut',
222            'ON' => 'Ontario',
223            'PE' => 'Prince Edward Island',
224            'QC' => 'Quebec',
225            'SK' => 'Saskatchewan',
226            'YT' => 'Yukon',
227        ]
228    ];
229
230    /**
231     * A list of possibly unit types
232     * @var array $unitTypes
233     * */
234    protected static array $unitTypes = [
235        'APARTMENT'  => 'APT',
236        'APT'        => 'APT',
237        'BASEMENT'   => 'BSMT',
238        'BSMT'       => 'BSMT',
239        'BLDG'       => 'BLDG',
240        'BUILDING'   => 'BLDG',
241        'DEPARTMENT' => 'DEPT',
242        'DEPT'       => 'DEPT',
243        'FL'         => 'FL',
244        'FLR'        => 'FL',
245        'FLOOR'      => 'FL',
246        'FRNT'       => 'FRNT',
247        'FRONT'      => 'FRNT',
248        'HANGAR'     => 'HNGR',
249        'HNGR'       => 'HNGR',
250        'LBBY'       => 'LBBY',
251        'LOBBY'      => 'LBBY',
252        'LOT'        => 'LOT',
253        'LOWER'      => 'LOWR',
254        'LOWR'       => 'LOWER',
255        'NO'         => 'NUMBER',
256        'OFC'        => 'OFC',
257        'OFFICE'     => 'OFC',
258        'PENTHOUSE'  => 'PH',
259        'PH'         => 'PH',
260        'PIER'       => 'PIER',
261        'REAR'       => 'REAR',
262        'RM'         => 'RM',
263        'ROOM'       => 'RM',
264        'SIDE'       => 'SIDE',
265        'SLIP'       => 'SLIP',
266        'SPACE'      => 'SPC',
267        'SPC'        => 'SPC',
268        'STE'        => 'STE',
269        'STOP'       => 'STOP',
270        'SUITE'      => 'STE',
271        'TRAILER'    => 'TRLR',
272        'TRLR'       => 'TRLR',
273        'UNIT'       => 'UNIT',
274        'UPPER'      => 'UPPR',
275        'UPPR'       => 'UPPR',
276        '#'          => '#',
277    ];
278
279
280    /**
281     * Getter method for accessing common route types list
282     *
283     * @return array
284     */
285    public function getCommonRouteTypes(): array
286    {
287        $routes = self::$commonRouteTypes;
288
289        usort($routes, function($a, $b) {
290            return strlen($b) - strlen($a);
291        });
292
293        return $routes;
294    }
295
296    /**
297     * Getter method for accessing route types list
298     *
299     * @param  bool $merge
300     * @return array
301     */
302    public function getRouteTypes(bool $merge = false): array
303    {
304        $routes = self::$routeTypes;
305
306        if ($merge) {
307            $keys   = array_keys($routes);
308            $values = array_values($routes);
309            $routes = array_unique(array_merge($keys, $values));
310
311            usort($routes, function($a, $b) {
312                return strlen($b) - strlen($a);
313            });
314        }
315
316        return $routes;
317    }
318
319    /**
320     * Getter method for accessing directionals associative array
321     *
322     * @return array
323     */
324    public function getDirections(): array
325    {
326        $directions = array_unique(array_merge(array_values(self::$directions), array_keys(self::$directions)));
327        usort($directions, function ($a, $b) {return strlen($b) - strlen($a);});
328        return $directions;
329    }
330
331    /**
332     * Getter method for accessing states associative array
333     *
334     * @param  string $country
335     * @return array
336     */
337    public function getStates(string $country = 'US'): array
338    {
339        return self::$states[$country];
340    }
341
342    /**
343     * Getter method for accessing two-letter state abbreviations
344     *
345     * @param  string $country
346     * @return array
347     */
348    public function getStateCodes(string $country = 'US'): array
349    {
350        return array_keys(self::$states[$country]);
351    }
352
353    /**
354     * Getter method for accessing full state names
355     *
356     * @param  string $country
357     * @return array
358     */
359    public function getStateNames(string $country = 'US'): array
360    {
361        return array_values(self::$states[$country]);
362    }
363
364    /**
365     * Getter method for accessing unit types list
366     *
367     * @return array
368     */
369    public function getUnitTypes(): array
370    {
371        $unitTypes = array_merge(array_values(self::$unitTypes), array_keys(self::$unitTypes));
372        usort($unitTypes, function ($a, $b) {return strlen($b) - strlen($a);});
373        return array_unique($unitTypes);
374    }
375
376}