Ted's Blog



PHP 获取右侧临近值


需求:获取离当前时间最近的刻钟  例如:当前分别为16、33、 47分钟 通过方法获取的值分别为30、45、15


/**
 * 获取右侧临近值
 * @param $needle
 * @param array $ruleList
 * @param int $start
 * @param int $end
 * @return bool|mixed
 */
public function getNearestRightVal($needle,array $ruleList = [15,30,45],$start = 0,$end = 0){

    $start = 0;
    $ruleList = sort($ruleList);
    $end = $end == 0 ? count($ruleList)-1 : $end;

    //采用二分法查找
    $middle = floor(($end + $start) / 2);

    //判断
    if($ruleList[$middle] == $needle){

        //已经找到了,递归的出口
        return $ruleList[$middle];
    }elseif($ruleList[$middle] < $needle){

        //要查找的元素在数组的后半段
        $start = $middle + 1;

        if($ruleList[$start] > $needle){
            return $ruleList[$start];
        }

        //边界值
        if($start >= $end){
            //没有找到,但是已经超出边界值,递归出口
            //TODO 如有需要进位的在此处处理
            return $ruleList[0];
        }

        //调用自己去查找:递归点
        return $this->getStartMinute($needle,$ruleList,$start,$end);
    }else{
        //要查找的元素在数组的前半段
        $end = $middle - 1;
        //判断边界值
        if($end < 0){
            return $ruleList[$middle];
        }

        if($ruleList[$end] < $needle){
            return $ruleList[$middle];
        }

        if($end == 0){
            return $ruleList[$end];
        }

        //调用自己:递归点
        return $this->getStartMinute($needle,$ruleList,$start,$end);
    }

    //都没有找到
    return false;

}


分享:

写评论


Contact ME

github:https://github.com/tebie6

email:liumingyuphp@163.com

友情链接

无敌我大鑫哥:http://dream128.cn