Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Zip.php
Go to the documentation of this file.
1 <?php
12 
13 class Zip
14 {
22  public static function parseRegions($state, $zip)
23  {
24  return !empty($zip) && $zip != '*' ? self::parseZip($zip) : ($state ? [$state] : ['*']);
25  }
26 
33  public static function parseZip($zip)
34  {
35  if (strpos($zip, '-') === false) {
36  return [$zip];
37  } else {
38  return self::zipRangeToZipPattern($zip);
39  }
40  }
41 
52  public static function zipRangeToZipPattern($zipRange)
53  {
54  $zipLength = 5;
55  $zipPattern = [];
56 
57  if (!preg_match("/^(.+)-(.+)$/", $zipRange, $zipParts)) {
58  return [$zipRange];
59  }
60 
61  if ($zipParts[1] == $zipParts[2]) {
62  return [$zipParts[1]];
63  }
64 
65  if ($zipParts[1] > $zipParts[2]) {
66  list($zipParts[2], $zipParts[1]) = [$zipParts[1], $zipParts[2]];
67  }
68 
69  $from = str_split($zipParts[1]);
70  $to = str_split($zipParts[2]);
71 
72  $startZip = '';
73  $diffPosition = null;
74  for ($pos = 0; $pos < $zipLength; $pos++) {
75  if ($from[$pos] == $to[$pos]) {
76  $startZip .= $from[$pos];
77  } else {
78  $diffPosition = $pos;
79  break;
80  }
81  }
82 
83  /*
84  * calculate zip-patterns
85  */
86  if (min(array_slice($to, $diffPosition)) == 9 && max(array_slice($from, $diffPosition)) == 0) {
87  // particular case like 11000-11999 -> 11*
88  return [$startZip . '*'];
89  } else {
90  // calculate approximate zip-patterns
91  $start = $from[$diffPosition];
92  $finish = $to[$diffPosition];
93  if ($diffPosition < $zipLength - 1) {
94  $start++;
95  $finish--;
96  }
97  $end = $diffPosition < $zipLength - 1 ? '*' : '';
98  for ($digit = $start; $digit <= $finish; $digit++) {
99  $zipPattern[] = $startZip . $digit . $end;
100  }
101  }
102 
103  if ($diffPosition == $zipLength - 1) {
104  return $zipPattern;
105  }
106 
107  $nextAsteriskFrom = true;
108  $nextAsteriskTo = true;
109  for ($pos = $zipLength - 1; $pos > $diffPosition; $pos--) {
110  // calculate zip-patterns based on $from value
111  if ($from[$pos] == 0 && $nextAsteriskFrom) {
112  $nextAsteriskFrom = true;
113  } else {
114  $subZip = '';
115  for ($k = $diffPosition; $k < $pos; $k++) {
116  $subZip .= $from[$k];
117  }
118  $delta = $nextAsteriskFrom ? 0 : 1;
119  $end = $pos < $zipLength - 1 ? '*' : '';
120  for ($i = $from[$pos] + $delta; $i <= 9; $i++) {
121  $zipPattern[] = $startZip . $subZip . $i . $end;
122  }
123  $nextAsteriskFrom = false;
124  }
125 
126  // calculate zip-patterns based on $to value
127  if ($to[$pos] == 9 && $nextAsteriskTo) {
128  $nextAsteriskTo = true;
129  } else {
130  $subZip = '';
131  for ($k = $diffPosition; $k < $pos; $k++) {
132  $subZip .= $to[$k];
133  }
134  $delta = $nextAsteriskTo ? 0 : 1;
135  $end = $pos < $zipLength - 1 ? '*' : '';
136  for ($i = 0; $i <= $to[$pos] - $delta; $i++) {
137  $zipPattern[] = $startZip . $subZip . $i . $end;
138  }
139  $nextAsteriskTo = false;
140  }
141  }
142 
143  if ($nextAsteriskFrom) {
144  $zipPattern[] = $startZip . $from[$diffPosition] . '*';
145  }
146  if ($nextAsteriskTo) {
147  $zipPattern[] = $startZip . $to[$diffPosition] . '*';
148  }
149 
150  return $zipPattern;
151  }
152 }
static zipRangeToZipPattern($zipRange)
Definition: Zip.php:52
static parseZip($zip)
Definition: Zip.php:33
$start
Definition: listing.phtml:18
static parseRegions($state, $zip)
Definition: Zip.php:22
$pos
Definition: list.phtml:42
$i
Definition: gallery.phtml:31