O functie ce returneaza
numarul cel mai apropiat, imediat mai mic si mai mare. Aceasta functie, closestLowerHigherNr(), primeste doi parametri: un array cu numere, si numarul. Compara acel numar cu numerele din array, apoi returneaza un array asociativ cu trei elemente: numarul imediat mai mic ('lower'), numarul imediat mai mare ('higher'), si cel mai apropiat numar ('closest').ay, than returns an associative array with the "lower", "higher", and "closest" number.
<?php
// returneaza un array cu numerele din $array imediat mai mic, mai mare si cel mai apropiat de $nr
function closestLowerHigherNr($array, $nr) {
// Curs PHP-MySQL - https://marplo.net/php-mysql/
sort($array); // sorteaza array-ul cu numerele in ordine crescatoare
// seteaza array-ul care va fi returnat, initial cu numerele cel mai mare, cel mai mic din $array, si $nr
$re_arr = array('lower'=>min(current($array), $nr), 'higher'=>max(end($array), $nr), 'closest'=>$nr);
// parcurge numerele, retine in $re_arr numerele imediat mai mic, mai mare, cel mai apropiat
foreach($array AS $num){
if($nr > $num) $re_arr['lower'] = $num;
else if($nr <= $num){
// daca numarul curent din $array e egal cu $nr, sau imediat mai mare, retine acel numar
// si opreste instructiunea foreach()
$re_arr['higher'] = $num;
break;
}
}
// aici se obtine cel mai apropiat numar de $nr
// (numarul ('lower' or 'higher') cu cea mai mica diferenta fata de $nr)
$re_arr['closest'] = (abs($nr - $re_arr['lower']) < abs($re_arr['higher'] - $nr)) ? $re_arr['lower'] : $re_arr['higher'];
return $re_arr;
}
// Exemplu
$numbers = array(-8, -3, 0, 5.8, 12, 9, 2.1);
// apeleaza functia cu trei numere pt test
$test1 = closestLowerHigherNr($numbers, -6);
$test2 = closestLowerHigherNr($numbers, 3);
$test3 = closestLowerHigherNr($numbers, 9);
// verifica valorile din $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 )
?>
Aceasta functie e buna si in cazul in care $nr este mai mic, sau mai mare decat oricare numar din $array.
Exemplu:
<?php
// Aici se adauga functia closestLowerHigherNr()
$numbers = array(-8, 2, 12);
$test4 = closestLowerHigherNr($numbers, -23); // -23 e mai mic decat oricare numar din $numbers
$test5 = closestLowerHigherNr($numbers, 18); // 18 e mai mare decat oricare numar din $numbers
// verifica valorile din $test4, $test5
var_export($test4); // array ( 'lower' => -23, 'higher' => -8, 'closest' => -23 )
var_export($test5); // array ( 'lower' => 12, 'higher' => 18, 'closest' => 18, )
?>
- Iata si un exemplu practic de utilizare a functiei closestLowerHigherNr(). Obtine directia cardinala (Nord, Est, Sud-Est, etc.) in functie de o valoare aleatoare in grade de cerc.
<?php
// Aici se adauga functia closestLowerHigherNr()
// array cu graade de cerc si directia lor cardinala
$direction = array(0=>'Est',30=>'Est-Est-Nord',45=>'Nord-Est',60=>'Nord-Nord-Est',90=>'Nord',120=>'Nord-Nord-Vest',135=>'Nord-Vest',150=>'Vest-Vest-Nord',180=>'Vest',210=>'Sud-Vest-Vest',225=>'Sud-Vest',240=>'Sud-Sud-Vest',270=>'Sud',300=>'Sud-Sud-Est',315=>'Sud-Est',330=>'Sud-Est-Est');
$degrees = array_keys($direction); // retine indexii / gradele intr-un array
// cateva directii (in grade de cerc)
$deg1 = 0;
$deg2 = 50;
$deg3 = 215;
// obtine array-ul in care e si numarul /indexul cel mai apropiata fiecarui grad
$drg1 = closestLowerHigherNr($degrees, $deg1);
$drg2 = closestLowerHigherNr($degrees, $deg2);
$drg3 = closestLowerHigherNr($degrees, $deg3);
// obtine directia cardinala apropiat pt fiecare grad (folosind cel mai apropiat numar)
$dtn1 = $direction[$drg1['closest']];
$dtn2 = $direction[$drg2['closest']];
$dtn3 = $direction[$drg3['closest']];
// test
echo "$deg1 grade = $dtn1"; // 0 grade = Est
echo "$deg2 grade = $dtn2"; // 50 grade = Nord-Est
echo "$deg3 grade = $dtn3"; // 215 grade = Sud-Vest-Vest
?>