Lekce 17 - Matematické funkce v PHP
V minulé lekci, Tvorba knihoven v PHP, jsme se naučili tvořit vlastní knihovny.
PHP je známo svou velkou zásobou funkcí. A nalezneme zde samozřejmě i matematické funkce. Dnes si představíme ty nejdůležitějších a nejpoužívanějších z nich.
Funkce round()
, ceil()
, floor()
Někdy nám při výpočtech vyjdou čísla jako 3,185643854. A ne vždy potřebujeme takto přesné číslo nebo dokonce vůbec jeho desetinnou část. A na to tu máme 3 funkce.
Funkce round()
Klasické zaokrouhlování, které známe ze školních lavic. „Co je pod polovinu zaokrouhlíme dolů, co je nad nebo rovno polovině tak nahoru“. Druhým parametrem se dá i určit přesnost, tzn. na kolik desetinných míst budete zaokrouhlovat.
Příklad:
round(5); // 5 round(5.1); // 5 round(5.4); // 5 round(5.5); // 6 round(5.8); // 6 round(5483.47621, 2); // 5483.47 round(5483.47621, -2); // 5500
U funkce round je i třetí parametr, kde můžete nastavit mód. Zde se dá
nastavit „půlící hodnota“, tzn. číslice 5, zda se zaokrouhlí nahoru
či dolů. Pro podrobnější pochopení těchto módů si doporučuji
přečíst oficiální dokumentaci a nebo si jednoduše chvíli zkoušet a hrát
si s tím. Zde je jednoduchá tabulka ukazující rozdíly mezi těmito módy.
Defaultní hodnota pro PHP je PHP_ROUND_HALF_UP
.
Číslo | Round | PHP_ROUND_HALF_UP | PHP_ROUND_HALF_DOWN | PHP_ROUND_HALF_EVEN | PHP_ROUND_HALF_ODD |
---|---|---|---|---|---|
5 | 5 | 5 | 5 | 5 | 5 |
5.1 | 5 | 5 | 5 | 5 | 5 |
5.2 | 5 | 5 | 5 | 5 | 5 |
5.3 | 5 | 5 | 5 | 5 | 5 |
5.4 | 5 | 5 | 5 | 5 | 5 |
5.5 | 6 | 6 | 5 | 6 | 5 |
5.6 | 6 | 6 | 6 | 6 | 6 |
5.7 | 6 | 6 | 6 | 6 | 6 |
5.8 | 6 | 6 | 6 | 6 | 6 |
5.9 | 6 | 6 | 6 | 6 | 6 |
6 | 6 | 6 | 6 | 6 | 6 |
Číslo | Round | PHP_ROUND_HALF_UP | PHP_ROUND_HALF_DOWN | PHP_ROUND_HALF_EVEN | PHP_ROUND_HALF_ODD |
---|---|---|---|---|---|
-5 | -5 | -5 | -5 | -5 | -5 |
-5.1 | -5 | -5 | -5 | -5 | -5 |
-5.2 | -5 | -5 | -5 | -5 | -5 |
-5.3 | -5 | -5 | -5 | -5 | -5 |
-5.4 | -5 | -5 | -5 | -5 | -5 |
-5.5 | -6 | -6 | -5 | -6 | -5 |
-5.6 | -6 | -6 | -6 | -6 | -6 |
-5.7 | -6 | -6 | -6 | -6 | -6 |
-5.8 | -6 | -6 | -6 | -6 | -6 |
-5.9 | -6 | -6 | -6 | -6 | -6 |
-6 | -6 | -6 | -6 | -6 | -6 |
Důležité je také upozornit jak PHP zpracovává různé formáty čísel.
Kompilátor neřeší datový typ (vezme jak string
tak
float
), ovšem problematická může být desetinná čárka vs.
desetinná tečka. Tento problém lze vyřešit funkcí
number_format
(který si podrobně popíšeme u práce se
stringy).
Příklad:
echo round("4,8"). "<br />"; // 4, jelikož kompilátor to usekne pouze na číslici 4 echo round("4.8"). "<br />"; // 5, kompilátor je schopen převést datový typ echo round(4,8). "<br />"; // 4 echo round(4.8). "<br />"; // 5
Funkce ceil()
a floor()
Tyto funkce vám vždy zaokrouhlí desetinné číslo stejným směrem, bez
ohledu jestli je v horní nebo spodní polovině. Funkce ceil()
zaokrouhluje vždy nahoru, funkce floor()
dolů. Není zde bohužel
parametr na přesnost, tudíž to jde pouze jen na jednotky.
Příklad:
ceil(4.2); // 5 ceil(4.5); // 5 ceil(4.7); // 5 floor(4.2); // 4 floor(4.5); // 4 floor(4.7); // 4
Zde můžete i vidět porovnání těchto 3 funkcí v tabulce.
Číslo | Round | Ceil | Floor | Číslo | Round | Ceil | Floor |
---|---|---|---|---|---|---|---|
5 | 5 | 5 | 5 | -5 | -5 | -5 | -5 |
5.1 | 5 | 6 | 5 | -5.1 | -5 | -5 | -6 |
5.2 | 5 | 6 | 5 | -5.2 | -5 | -5 | -6 |
5.3 | 5 | 6 | 5 | -5.3 | -5 | -5 | -6 |
5.4 | 5 | 6 | 5 | -5.4 | -5 | -5 | -6 |
5.5 | 6 | 6 | 5 | -5.5 | -6 | -5 | -6 |
5.6 | 6 | 6 | 5 | -5.6 | -6 | -5 | -6 |
5.7 | 6 | 6 | 5 | -5.7 | -6 | -5 | -6 |
5.8 | 6 | 6 | 5 | -5.8 | -6 | -5 | -6 |
5.9 | 6 | 6 | 5 | -5.9 | -6 | -5 | -6 |
6 | 6 | 6 | 5 | -6 | -6 | -5 | -6 |
Goniometrické funkce
Většina z nás zná 4 goniometrické funkce: sinus, cosinus, tangens,
cotagens. PHP má však funkcí s goniometrií rovnou 12. Zde je jejich ukázka:
sin()
, asin()
, sinh()
,
asinh()
. Důležité je pro začátek zmínit, že parametr je v
radiánech. Pokud byste chtěli zadávat úhel, musíte použít funkci
deg2rad()
.
sin()
= klasický sinusasin()
= arkus sinus (inverzní funkce k sinus, možná znáte z kalkulaček jako sin−1)sinh()
= hyperbolický sinusasinh()
= Inverzní hyperbolický sinus. (spojení těch dvou)
Hyberbolický sinus v praxi ale asi jen tak nepoužijete, trvalo nám dlouho zjistit, oč se vlastně jedná. Funkce by měla fungovat stejně jako sinus, ale hodnoty nejsou na jednotkové kružnici, ale na jednotkové hyperbole.
Stejné zastoupení má i cosinová funkce (cos()
,
acos()
, cosh()
, acosh()
) a tangens
(tan()
, atan()
, tanh()
,
atanh()
). Navíc je však zde funkce atan2()
, kde
počítá se dvěma hodnotami, a je to, jako bychom počítali arkus tangens y/x
s tím rozdílem, že funkce podle znamének vybere kvadrant. Věřím ale, že
tyto funkce opravdu jen tak nevyužijete a klasický sinus, cosinus, tangens
vám bude stačit. Mimochodem, pokud jste to ve škole zaspali, cotangens lze
udělat jako 1/tan(x).
Příklad
echo sin(30); // -0.98803162409286 echo sin(deg2rad(30)); // 0.5 echo cos(deg2rad(123)); // -0.54463903501503 echo 1/tan(deg2rad(45)); // 1 (onen cotangens) echo sin(deg2rad(500)); // 0.64278760968654 echo atan2(deg2rad(50), deg2rad(23)); // 1.1396575860761
Funkce deg2rad()
a rad2deg()
Zmíněný převod mezi radiány a stupni.
Příklad:
echo deg2rad(45); //0.785398163 echo rad2deg(0.401425728); //23
Převod soustav
V PHP je několik funkcí na převod mezi různými soustavami. Ukažme si příklady:
Příklad:
echo decoct(24); // 30 (z desítkové do osmičkové) echo dechex(24); // 18 (z desítkové do šestnáctkové) echo decbin(24); // 11000 (z desítkové do dvojkové) echo bindec(101110); // 46 (z dvojkové do desítkové) echo octdec(24); // 20 (z osmičkové do desítkové) echo hexdec(24); // 36 (z šestnáctkové do osmičkové)
Ovšem stačí si zapamatovat jen jednu funkci a to
base_convert()
, kterou převedete z libovolné soustavy do další
libovolné. Třeba i trojkové:
echo base_convert("2AF36", 16, 3); //22221022210 (z šestnáctkové do trojkové)
Kontrola typu čísla
V PHP jde jednoduše podle určitých funkcí zjistit, zda je číslo
konečné, nekonečné nebo neznámé díky funkcím is_finite()
,
is_infinite()
, a is_nan()
. Používají s často v
podmínkách, jejich návratová hodnota je boolean
.
Příklad
Funkce is_finite()
ukazuje, zda je číslo konečné:
var_dump(is_finite(log(0))); //false var_dump(is_finite(10/0)); //ERROR var_dump(is_finite(6)); //true var_dump(is_finite(9223372036854775807)); //true (PHP_INT_MAX) var_dump(is_finite(9223372036854775807+1)); //true var_dump(is_finite(8.5070591730235E+37)); //true
is_infinite()
vrací zda je číslo nekonečné (lze nahradit za!is_finite()
)is_nan()
kontroluje zda se nejedná o neznámou hodnotu
Příklad
var_dump(is_nan(acos(30))); //true var_dump(is_nan(48)); //false var_dump(is_nan(10/0)); //ERROR
Další důležité matematické funkce
abs(x)
= vrací absolutní hodnotuexp(x)
= exponencionální funkceexpm1(x)
= je definován jakoexp(x)-1
. Opět nějaká zvláštní matematická funkcefmod(x, y)
= vrací desetinný zbytek po celočíselném dělení x/yhypot (x, y)
= výpočet přepony u pravoúhlého trojúhelníku (pythagorova věta)log(x, y)
= logaritmusx
o základuy
. Pokud nezadáte základ, je defaultní hodnota konstantaM_E
->2.718281828459
)log10(x)
= logaritmus o základu10
log1p(x)
= logaritmus(1+x)
min(x) a `max(x)
= najde minimální nebo maximální hodnotu z pole čísel.rand(x, y)
,mt_rand(x, y)
= funkce generování čísel (mt_rand()
má vylepšený algoritmus)pow(x, y)
= mocninax
nay
sqrt(x)
= vrací druhou odmocninux
Statické funkce
getrandmax()
= vrací maximální hodnotu funkcerand()
;pi
= vrací3.1415926535898
, stejné jako konstantaM_PI
Konstanty
PHP má i předefinované vlastní konstanty, a dost je jich i v PHP. Zde je výpis několika hlavních:
Název | Hodnota | Popis |
---|---|---|
M_PI | 3.14159265358979323846 | π |
M_PI2 | 1.57079632679489661923 | π/2 |
M_PI4 | 0.78539816339744830962 | π/4 |
M1_PI | 0.31830988618379067154 | 1/π |
M2_PI | 0.63661977236758134308 | 2/π |
M_SQRTPI | 1.77245385090551602729 | odmocnina z π |
M2_SQRTPI | 1.12837916709551257390 | 2/odmocnina z π |
M_LNPI | 1.14472988584940017414 | log_e(π) |
M_SQRT2 | 1.41421356237309504880 | odmocnina z 2 |
M_SQRT3 | 1.73205080756887729352 | odmocnina z 3 |
M_SQRT1_2 | 0.70710678118654752440 | 1/odmocnina z 2 |
M_EULER | 0.57721566490153286061 | Eulerova konstanta |
To je vše ohledně matematiky a práce s čísly v PHP. Jak sami jste si všimli, spousta funkcí je zbytečná a nahrazují někdy jen pomalu 2 – 3 řádky kódu. Proto si zapamatujte jen ty nejdůležitější funkce a konstanty. Když se naopak dostanete do situace, že někde potřebujete spočítat něco velmi rychle, je dobrý nápad se podívat po zvláštních funkcích, jelikož jsou napsané v céčku a v PHP výpočty těžko uděláme tak rychle (např. zmíněnou Pythagorovu větu).
Zde ještě jednou je nejdůležitější výpis funkcí:
round()
,ceil()
,floor()
sin()
,cos()
,tan()
base_convert()
,deg2rad()
,rad2deg()
abs()
,log()
,mt_rand()
,pow()
,sqrt()
,fmod()
min()
,max()
Pokud vás PHP funkce více zajímají, máme na ně celý kurz.
V další lekci, Pokročilá konfigurace PHP (XAMPP), se naučíme konfigurovat PHP (XAMPP) pro lokální vývoj reálných projektů, zprovozníme si subdomény, odesílání emailů a import velkých MySQL souborů.
Komentáře


Zobrazeno 4 zpráv z 4.