PHP实现数字范围的合并

介绍

本文是为了实现类似 8<x≤10 和 9<y 这种范围(当然包括各种范围,等于,大于等于,大于,小于,小于等于)合并,比如结果是:9<z≤10

实现

实现方式是先考虑范围的表示,因为毕竟无法用代码直接写这些范围。这里使用字母和数组代表对应的范围,比如:

18<x<=10 
使用:
array(
'gt'=>8,
'elt'=>10,
)
2、x=10
使用:
array(
'eq'=>10
)

来表示,也就是:

大于:gt
大于等于:egt
小于:lt
小于等于:elt
等于:eq

这样就能代表出所有的范围信息,然后依次使用各种情况的判断大小方法来进行范围的合并:

/**
     * 合并两个范围的信息
     * @param $data1
     * @param $data2
     * @return array
     * @author sunnier <xiaoyao_xiao@126.com>
     */
    private function mergeThickness($data1, $data2)
    {
        if (is_array($data1['id'])) {
            if (is_array($data2['id'])) {
                $idArr = array_merge($data1['id'], $data2['id']);
                $idArr = array_unique($idArr);
            } else {
                $dataId = $data1['id'];
                array_push($dataId, $data2['id']);
                $idArr = array_unique($dataId);
            }
        } else {
            if (is_array($data2['id'])) {
                $dataId = $data2['id'];
                array_push($dataId, $data1['id']);
                $idArr = array_unique($dataId);
            } else {
                $idArr = array($data1['id'], $data2['id']);
            }
        }
        //判断有没有等于的情况
        $eqFlag = $this->ifExitEqual($data1['thickness_range'], $data2['thickness_range']);
        if ($eqFlag) {
            //如果存在等值的情况按照等值的情况计算
            $result = array(
                'id'=>$idArr,
                'thickness_range'=>$this->equalMergeThick($data1['thickness_range'], $data2['thickness_range']),
            );
        } else {
            //不存在等值的情况则依次判断各种类型的范围
            //先判断是范围还是只有一个大小
            if (count($data1['thickness_range']) > 1) {
                //证明是一个闭环范围
                //在判断数据2是否是闭环
                if (count($data2['thickness_range']) > 1) {
                    $result = array(
                        'id' => $idArr,
                        'thickness_range' => $this->closeMergeThick($data1['thickness_range'], $data2['thickness_range']),
                    );
                } else {
                    $result = array(
                        'id' => $idArr,
                        'thickness_range' => $this->sideMergeThick($data1['thickness_range'], $data2['thickness_range']),
                    );
                }
            } else {
                //否则就是一个大小范围
                if (count($data2['thickness_range']) > 1) {
                    $result = array(
                        'id' => $idArr,
                        'thickness_range' => $this->sideMergeThick($data2['thickness_range'], $data1['thickness_range']),
                    );
                } else {
                    //都不是闭环的比较,也就是都是单侧
                    $result = array(
                        'id' => $idArr,
                        'thickness_range' => $this->allSideMerge($data2['thickness_range'], $data1['thickness_range']),
                    );
                }
            }
        }
        return $result;
    }

具体还有其他具体合并的代码见压缩包:
下载

以上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值