以下是自己整理的一些方法源码,不喜勿喷
class Math{
public function getMiddle($arr){ //求出中位数。
$middleLen = ceil(sizeof($arr)/2);
$base = $arr[0];
if( sizeof($arr) == 1) { return $base;}
$l_arr = array();
$r_arr = array();
for($i =1;$i< sizeof($arr);$i++){
if( $arr[$i] < $base) { $l_arr[]= $arr[$i];} //小于的往左边放,大于的往右边放。
else{
$r_arr[]= $arr[$i];
}
}
if( sizeof($l_arr) == $middleLen -1){
return $base;
}else if( sizeof($l_arr) > $middleLen -1){ //左边数组过大
return $this->getMiddle($l_arr , $middleLen);
}else{ //右边更大.
$middleLen = $middleLen - sizeof($l_arr);
return $this->getMiddle($r_arr , $middleLen);
}
}
public function getAvg($arr){ //求出平均数。
$max=0;
for($i=0;$i<count($arr);$i++){
$max+=floor($arr[$i]);
}
return $max/count($arr);
}
public function getMax($arr){ //求出最大值。
$pos = array_search(max($arr), $arr);
return $arr[$pos];
}
public function getMin($arr){ //求出最小值。
$pos = array_search(min($arr), $arr);
return $arr[$pos];
}
public function getjicha($arr){//求出极差
return $this->getMax($arr)-$this->getMin($arr);
}
public function getNumber($arr){//求出出现最多的值和次数
$arr = array_count_values($arr);
arsort($arr);
$max_number = reset($arr);
$more_value = key($arr);
$row=array();
$row['value']=$more_value;//出现最多的次数值
$row['value']=$max_number;//出现次数最多的值
return $row;
}
function NextNumberArray($Number, $NumberRangeArray){
//NextNumberArray(1, array(1, 2, 4, 5, 6, 7))求出数组中最接近1的数字
$w = 0;
$c = -1;
$abstand = 0;
$l = count($NumberRangeArray);
for($pos=0; $pos < $l; $pos++){
$n = $NumberRangeArray[$pos];
$abstand = ($n < $Number) ? $Number - $n : $n - $Number;
if ($c == -1){
$c = $abstand;
continue;
}
else if ($abstand < $c){
$c = $abstand;
$w = $pos;
}
}
//10-20更新
//因为我们项目是计算时间,时间只能向前查找,所以需要根据当前的数字再次判断,若接近时间大于当前时间,需要获取前一位的时间
if ($Number < $NumberRangeArray[$w]) {
return $NumberRangeArray[$w -1];
}
return $NumberRangeArray[$w];
}
}