介绍
本文是为了实现类似 8<x≤10 和 9<y 这种范围(当然包括各种范围,等于,大于等于,大于,小于,小于等于)合并,比如结果是:9<z≤10
实现
实现方式是先考虑范围的表示,因为毕竟无法用代码直接写这些范围。这里使用字母和数组代表对应的范围,比如:
1、8<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;
}
具体还有其他具体合并的代码见压缩包:
下载