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