素材牛VIP会员
php一个算法问题
 骨***活  分类:Python  人气:1277  回帖:1  发布于6年前 收藏

首先是这样的 优惠方式有3种 分别是会员折扣 满减 优惠券 会员折扣和满减都是代码控制 也就是用户不可以控制 只有优惠券用户可以控制 倘若一个用户用时满足会员折扣和满减并且有优惠券 那么一下享受三种折扣 这样是很不好的对于商家来说 所以需要做一个防止折上折的算法

二进制来标记
0 表示只能有一种优惠 假如用户使用优惠券那当然即使其他2个满足了 也必须是使用优惠券了
1 表示会员折扣和满减
2 会员折扣和优惠券
4 满减和优惠券
8 三种一起 有就有没就没 也就是回归到之前的那种

同时还有一个开关来标记 会员折扣和满减谁优先

这里的组合只是表示能不能同时享受的意思 而不是一定要使用这样的优惠

举个例子 假如商家勾选了24 那就是优惠券这个优惠一定有的 如果你同时满足会员折扣和满减 那么就需要一个开关来判断你哪个优先了 如果是会员折扣优先 那么你享受的优惠就是 优惠券+会员折扣了

在比如 你只勾选了4 那就是优惠券+满减 那么如果你不符合满减 但是你符合会员折扣 但是会员折扣和优惠券那个没勾上 你也不能同时享受优惠券和会员打折 那你只能享受满减了

请问这个逻辑如果用代码如何实现了

讨论这个帖子(1)垃圾回帖将一律封号处理……

Lv4 码徒
Su***er JS工程师 6年前#1

我觉得这个二进制设计就不太对,二进制可以只用3个位来标记对应的优惠。

// 以下为二进制
000 // 表示无优惠,十进制0
001 // 表示会员折扣,十进制1
010 // 表示满减
100 // 表示优惠券

会员和满减谁优先,其实并不用标记。因为这个是产品折扣本身的信息,不需要基于用户选定的值。(永远不要相信用户输入)
所以,最后用户可能选的值就是从000111的值,也就是十进制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)

然后,你里面的具体逻辑自己写吧。

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取