我在英国有一个邮政编码列表,旁边有一个区域ID。现在,根据用户所在的区域,交付产品的成本更高。
例如,如果用户居住在伯明翰并且有一个以B开头的邮政编码,他将获得免费送货,因为该邮政编码区域没有任何费用。
同样,如果用户的邮政编码以IM开头,他们必须支付更多的邮寄,因为邮政编码区域更多。
样本邮编列表:
Postcode | Region
AL | A
BA | A
BB | A
BD | A
B | B
BH | B
LN | D
LS | D
IV1 | E
IV23 | F
从上面的示例中,如果用户想要获得投放并且他们的邮政编码以BA开头,那么我想应用A区的投放费率。
对于我如何以编程方式执行此操作,我实际上有点困惑。起初我以为我会做类似的事情:
$postcodes = [
'AL'=>'A',
'BA'=>'A',
//And so on ....
];
//get the first 2 letters
$user_input = substr( $user_postcode, 0, 2 );
if(array_key_exists($user_input,$postcodes)){
//Get the region code
$region = $postcodes[$user_input];
// Charge the user with the delivery rate specific to that user, then carry on
}
但问题是一些类似的邮政编码可能位于不同的区域,例如,IV1是区域E,IV23是区域F,如上所示。
这意味着我必须匹配用户的帖子代码,1,2,3或4个字符。这可能没有意义。详细说明见下文:
//From Birmingham and is in region B
$user1_input = 'B';
//From Bradford and is in region A
$user1_input = 'BD';
//From Inverness and is in region E
$user1_input = 'IV1';
因此,如果用户输入来自伯明翰并且用户输入以B开头,我怎么能告诉除了也以B开头但后面还有其他字母的邮政编码,这使得它成为不同的邮政编码。
我正在尽力解释,希望这确实有意义。如果没有,请询问更多信息。
任何人都可以帮助我了解如何实现这一目标的逻辑吗?无论是在Javascript还是PHP中,因为我之后可以转换逻辑。
答案 0 :(得分:1)
一种选择是按照邮政编码密钥的下降长度订购邮政编码/区域数组。这样,首先检查更长(更具体)的密钥。按照上面的列表,它会变成这样......
$postcodes = array(
"IV23" => "F",
"IV1" => "E",
"LS" => "D",
"LN" => "D",
"BH" => "B",
"BD" => "A",
"BB" => "A",
"BA" => "A",
"AL" => "A",
"B" => "B",
);
完成后,它就像循环数组一样简单,检查与提供的邮政编码匹配(从左侧开始),并在找到匹配时停止。
foreach($postcodes as $code => $region)
{
if($code == substr($user_postcode, 0, strlen($code)))
{
$shippingRegion = $region;
break;
}
}
echo $shippingRegion;
答案 1 :(得分:1)
如果你看起来像valid UK postcode,那么删除这些空格只搜索数组,直到找到匹配项:
$lookup = [
'' => 'X', // in case no match is found
'AL'=>'A',
'BA'=>'A',
//And so on ....
];
function get_delivery_for($postcode)
{
global $lookup;
for ($x=5; $x>0 && !$result; $x--) {
$result=$lookup[substr($postcode, 0, $x)];
}
return ($result);
}
请注意,上面的代码仅供参考,我建议您使用更精细的内容来避免它发出警告....
$result=isset($lookup[substr($postcode, 0, $x)])
? $lookup[substr($postcode, 0, $x)]
: false;