A function that returns
the lower, higher, and closest number. The function receives two parameters: an array with numbers, and the number. Compares that number with the numbers from array, than returns an associative array with three elements: the "lower", "higher", and "closest" number.
<?php
// retutrs an array with the number from $array: lower, higher and closest to $nr
function closestLowerHigherNr($array, $nr) {
// PHP-MySQL Course - https://coursesweb.net/php-mysql/
sort($array); // Sorts the array from lowest to highest
// sets the array that will be returned, initially with the lowest and highest number from $array
$re_arr = array('lower'=>min(current($array), $nr), 'higher'=>max(end($array), $nr), 'closest'=>$nr);
// traverse the numbers, stores in $re_arr the number immediately lower and higher than $nr
foreach($array AS $num){
if($nr > $num) $re_arr['lower'] = $num;
else if($nr <= $num){
// if the current number from $array is equal to $nr, or immediately higher, stores that number
// and stops the foreach() loop
$re_arr['higher'] = $num;
break;
}
}
// here it gets the closest number to $nr
// (the number ('lower' or 'higher') with the lowest diferrence between its value and $nr)
$re_arr['closest'] = (abs($nr - $re_arr['lower']) < abs($re_arr['higher'] - $nr)) ? $re_arr['lower'] : $re_arr['higher'];
return $re_arr;
}
// Example
$numbers = array(-8, -3, 0, 5.8, 12, 9, 2.1);
$test1 = closestLowerHigherNr($numbers, -6);
$test2 = closestLowerHigherNr($numbers, 3);
$test3 = closestLowerHigherNr($numbers, 9);
// see the values in $test1, $test2, $test3
var_export($test1); // array ( 'lower' => -8, 'higher' => -3, 'closest' => -8 )
var_export($test2); // array ( 'lower' => 2.1, 'higher' => 5.8, 'closest' => 2.1 )
var_export($test3); // array ( 'lower' => 5.8, 'higher' => 9, 'closest' => 9 )
?>
This function works also if $nr is lower, or higher than any number in $array.
Example:
<?php
// here add the closestLowerHigherNr() function
$numbers = array(-8, 2, 12);
$test4 = closestLowerHigherNr($numbers, -23); // -23 is lower than any number in $numbers
$test5 = closestLowerHigherNr($numbers, 18); // 18 is higher than any number in $numbers
// see the values in $test4, $test5
var_export($test4); // array ( 'lower' => -23, 'higher' => -8, 'closest' => -23 )
var_export($test5); // array ( 'lower' => 12, 'higher' => 18, 'closest' => 18, )
?>