首先是这样的 优惠方式有3种 分别是会员折扣 满减 优惠券 会员折扣和满减都是代码控制 也就是用户不可以控制 只有优惠券用户可以控制 倘若一个用户用时满足会员折扣和满减并且有优惠券 那么一下享受三种折扣 这样是很不好的对于商家来说 所以需要做一个防止折上折的算法
二进制来标记
0 表示只能有一种优惠 假如用户使用优惠券那当然即使其他2个满足了 也必须是使用优惠券了
1 表示会员折扣和满减
2 会员折扣和优惠券
4 满减和优惠券
8 三种一起 有就有没就没 也就是回归到之前的那种
同时还有一个开关来标记 会员折扣和满减谁优先
这里的组合只是表示能不能同时享受的意思 而不是一定要使用这样的优惠
举个例子 假如商家勾选了24 那就是优惠券这个优惠一定有的 如果你同时满足会员折扣和满减 那么就需要一个开关来判断你哪个优先了 如果是会员折扣优先 那么你享受的优惠就是 优惠券+会员折扣了
在比如 你只勾选了4 那就是优惠券+满减 那么如果你不符合满减 但是你符合会员折扣 但是会员折扣和优惠券那个没勾上 你也不能同时享受优惠券和会员打折 那你只能享受满减了
请问这个逻辑如果用代码如何实现了
我觉得这个二进制设计就不太对,二进制可以只用3个位来标记对应的优惠。
// 以下为二进制
000 // 表示无优惠,十进制0
001 // 表示会员折扣,十进制1
010 // 表示满减
100 // 表示优惠券
会员和满减谁优先,其实并不用标记。因为这个是产品折扣本身的信息,不需要基于用户选定的值。(永远不要相信用户输入)
所以,最后用户可能选的值就是从000
到111
的值,也就是十进制0到7。
然后,这样就很容易分离出每一个折扣来了:
$is_vip = $value & 1;
$is_amount_cut = ($value & 2) >> 1;
$is_discount = ($value & 4) >> 2;
拆完之后,下面的逻辑判断其实就非常容易了,先判断只能一种的情况
elseif($is_vip + $is_amount_cut + $is_discount > 1)
# 上面用了位移而没有直接使用布尔值,就是为了这边可以使每一个为真的优惠标记权值为1
# 权值加起来如果大于1,表示用了一种以上的优惠了
然后判断两个的情况
if($is_vip + $is_amount_cut + $is_discount == 2) {
if(!$is_vip)
...
elseif(!$is_amount_cut)
...
else
...
}
# 由于每个权值都是1,所以加起来等于2时候只可能有一个为假值(0)
# 所以只需要判断哪个标记为假,就可以判断出用了哪两种优惠
下面是三种优惠
elseif($is_vip + $is_amount_cut + $is_discount >= 3)
或者
elseif($is_vip && $is_amount_cut && $is_discount)
然后,你里面的具体逻辑自己写吧。