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;
}