123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- /**
- * Various methods for parsing Zip codes
- *
- */
- namespace Magento\Framework\Parse;
- class Zip
- {
- /**
- * Retrieve array of regions characterized by provided params
- *
- * @param string $state
- * @param string $zip
- * @return string[]
- */
- public static function parseRegions($state, $zip)
- {
- return !empty($zip) && $zip != '*' ? self::parseZip($zip) : ($state ? [$state] : ['*']);
- }
- /**
- * Retrieve array of regions characterized by provided zip code
- *
- * @param string $zip
- * @return string[]
- */
- public static function parseZip($zip)
- {
- if (strpos($zip, '-') === false) {
- return [$zip];
- } else {
- return self::zipRangeToZipPattern($zip);
- }
- }
- /**
- * Convert a Magento zip range to an array of zip patterns
- * (e.g., 12000-13999 -> [12*, 13*])
- *
- * @param string $zipRange
- * @return array
- * @SuppressWarnings(PHPMD.CyclomaticComplexity)
- * @SuppressWarnings(PHPMD.NPathComplexity)
- * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
- */
- public static function zipRangeToZipPattern($zipRange)
- {
- $zipLength = 5;
- $zipPattern = [];
- if (!preg_match("/^(.+)-(.+)$/", $zipRange, $zipParts)) {
- return [$zipRange];
- }
- if ($zipParts[1] == $zipParts[2]) {
- return [$zipParts[1]];
- }
- if ($zipParts[1] > $zipParts[2]) {
- list($zipParts[2], $zipParts[1]) = [$zipParts[1], $zipParts[2]];
- }
- $from = str_split($zipParts[1]);
- $to = str_split($zipParts[2]);
- $startZip = '';
- $diffPosition = null;
- for ($pos = 0; $pos < $zipLength; $pos++) {
- if ($from[$pos] == $to[$pos]) {
- $startZip .= $from[$pos];
- } else {
- $diffPosition = $pos;
- break;
- }
- }
- /*
- * calculate zip-patterns
- */
- if (min(array_slice($to, $diffPosition)) == 9 && max(array_slice($from, $diffPosition)) == 0) {
- // particular case like 11000-11999 -> 11*
- return [$startZip . '*'];
- } else {
- // calculate approximate zip-patterns
- $start = $from[$diffPosition];
- $finish = $to[$diffPosition];
- if ($diffPosition < $zipLength - 1) {
- $start++;
- $finish--;
- }
- $end = $diffPosition < $zipLength - 1 ? '*' : '';
- for ($digit = $start; $digit <= $finish; $digit++) {
- $zipPattern[] = $startZip . $digit . $end;
- }
- }
- if ($diffPosition == $zipLength - 1) {
- return $zipPattern;
- }
- $nextAsteriskFrom = true;
- $nextAsteriskTo = true;
- for ($pos = $zipLength - 1; $pos > $diffPosition; $pos--) {
- // calculate zip-patterns based on $from value
- if ($from[$pos] == 0 && $nextAsteriskFrom) {
- $nextAsteriskFrom = true;
- } else {
- $subZip = '';
- for ($k = $diffPosition; $k < $pos; $k++) {
- $subZip .= $from[$k];
- }
- $delta = $nextAsteriskFrom ? 0 : 1;
- $end = $pos < $zipLength - 1 ? '*' : '';
- for ($i = $from[$pos] + $delta; $i <= 9; $i++) {
- $zipPattern[] = $startZip . $subZip . $i . $end;
- }
- $nextAsteriskFrom = false;
- }
- // calculate zip-patterns based on $to value
- if ($to[$pos] == 9 && $nextAsteriskTo) {
- $nextAsteriskTo = true;
- } else {
- $subZip = '';
- for ($k = $diffPosition; $k < $pos; $k++) {
- $subZip .= $to[$k];
- }
- $delta = $nextAsteriskTo ? 0 : 1;
- $end = $pos < $zipLength - 1 ? '*' : '';
- for ($i = 0; $i <= $to[$pos] - $delta; $i++) {
- $zipPattern[] = $startZip . $subZip . $i . $end;
- }
- $nextAsteriskTo = false;
- }
- }
- if ($nextAsteriskFrom) {
- $zipPattern[] = $startZip . $from[$diffPosition] . '*';
- }
- if ($nextAsteriskTo) {
- $zipPattern[] = $startZip . $to[$diffPosition] . '*';
- }
- return $zipPattern;
- }
- }
|