Home logika: smycky Kapitola-04 About

LOGIKA: rozhodovanie a smycky

V kapitole 2 sme preberali zakladne informacie jak v PHP programoch reprezentovat data.
Program plny dat je vsak len polovica celku. Druhym dielom skladacky je pomocou tychto dat riadit jak program pobezi a jake akcie bude vykonavat.


Vsetky tieto akcie maju nieco spolocne, rozhoduju ci nejaka logicka podmienka tykajuca sa dat plati, alebo neplati, teda ci je pravdiva (true), alebo nepravdiva (false)

V prvom popisanom priklade je touto logickou podmienkou : "Prihlasil sa administrator?". Ak tato podmienka plati je true , zobrazi sa specialne menu.

Druhy priklad je totozny. Ak plati je true podmienka: "Je uz viac ako 3 hodiny poobede", zobrazi sa na stranke ine zahlavie.

A obdobne to je aj s poslednym prikladom: ak plati je true , ze uzivateloi pribudli nove spravy od doby kedy bol naposledy prihlaseny, oznami sa mu to.

Ked robite rozhodnutia, PHP engine danyvyraz zmrzkne na true a false

Hodnoty true a false sa pouzivaju v roznych jazykovych konstrukciach: Vhodnym prikladom moze byt prikaz if(), ktory sluzi k rozhodnutiu ci sa ma maju v programe spustit nejakeprikazy.
Prikaz if() a obdobne prikazy pouzivajte vzdy ked je vysledok behu programu zavisli na nejakych meniacich sa podmienkach.

Aj ked true a false su nepochybne zakladnymi kamenmi pri rozhodovani, v praxi si obvykle kladieme zlozitejsie napriklad: Je uzivatelovi najmenej 21 rokov? alebo ma tento uzivatel zaplateny pristup k tomuto webu alebo ma dost penazi na ucte , aby si mohol kupit jednoduchy pristup?

Hodnoty TRUE a FALSE

Kazdy vyraz v programe PHP ma hodnotu pravdivosti: true alebo false. Niekedy je tato hodnota pravdivosti dolezita pretoze ju pouzijete v nejakom vypocte inokedy ju ignorujete. Ak sa naozaj chcete naucit programovat v PHP je nezbytne spravne pochopit jak sa vyrazy vyhodnocuju na true alebo false.

Vacsina skalarnych hodnot je true.

Vsetky cele cisla a cisla v pohyblivej ciarke ( okrem 0 a 0,0) su true.

Vsetky retazce okrem dvoch: (retazec ktory neobsahuje vobec nic a retazec obsahujuci len znak 0 ) su true.

SPECIALNE KONSTANTY false a null sa tiez vyhodnocuju jak false

Vsetky ostatne sutrue.

Premenna ktora sa rovna jednej zo siestich false hodnot, alebo funkcia ktora vrati jednuz tejto sestice hodnot,sa tiez vyhodnoti na false. Akykolvek iny vyraz sa vyhodnoti na true.

Zistovanie hodnoty pravdivosti vyrazu sa robi v dvoch krokoch.
Najprv sa zisti samotna hodnota vyrazu.
potom SA SKONTROLUJE CI JE TATO HODNOTATRUE ALEBO FALSE.
Niektore vyrazy maju hodnoty dane normalnym sedliackym rozumom. Hodnota matematickeho vyrazu je taka aku by ste dostali,keby ste ho pocitali rucne s ceruzkou na papiery. Napriklad 7*6 je 42. Pretoze 42 je true vyraz 7*6 je taktiez true.
Vyraz 5-6+1 sa rovna 0. pretoze 0 je false vyraz 5-6+1 bude tiez false.

To iste plati pre retazenie retazcov. Hodnotou vyrazu ktory zretazi dva retazce je novy retazec zlozeny z oboch povodnych.
Vyraz: ' jacob' . '@example.com' sa rovna retazcu: 'jacob@example.com' , ktory je true

Hodnotou preradovacej operacie je priradovana hodnota.
Vyraz: $price = 5 savyhodnoti na 5 pretoze toto sa priradilo do $price.
Pretozepriradenie produkuje vysledok, mozeme ucinit retaz priradovacich operacii, abyste rovnaku hodnotu priradili do viacerych premennych:

			
				 $price  =  $quantity  =  5 ;
			
		

Vyraz znamena: "Nastav $price na vysledok nastavenia $quantity sa rovna 5".
Ked sa bude tento vyraz vyhodnocovat priradi sa cele cislo 5 do premennej $quantity.Vysledkom tohoto priradovacieho vyrazu bude 5 (priradovana hodnota ). Tento vysledok ( 5 ) sa nasledne priradi do premennej $price.
Obe premenne ($price aj $quantity) su teda v tomto momente nastavene na hodnotu 5.

Rozhodovanie

if()
- Ak je pravda(toto)

S konstrukciou if() mozete pouzivat v programe prikazy, ktore sa vykonaju len vtedy ak konkretne podmienky budu true. To umoznuje programu podnikat rozne akcie v zavislosti na okolnostiach.

Predstavte si napriklad ze chcete skontrolovat,ci uzivatel zadal do weboveho formulara platnu informaciu pred tym, nez mu dovolite pristup k citlivym datam

Konstrukcia if() vykona blok kodu vtedy,ak jeho testovaci vyraz bude true:

			
				if ($logged_in) {
				print "Welcome aboard, trusted user. ";
			}
			
		

Konstrukcia if() zistuje hodnotu pravdivosti vyrazu vo vnutri zatvoriek (testovaci vyraz). Ak sa tento vyraz vyhodnoti na true, spustia sa prikazy nachadzajuce sa vnutri v zlozenych zatvorkach za if()

Ak vyraz neni true program pokracuje prikazmi nachadzajucimi sa az za zlozenymi zatvorkami.
V tomto pripade je testovacim vyrazom len premenna $logged_in.
Ak $logged_inje true (alebo ma hodnotu, kt. savyhodnoti ako true) vytlaci sa pozdrav: "Welcome aboard, trusted user. "

V bloku kodu vnutri zlozenych zatvoriek mozete mat tolko prikazov kolko potrebujete!!!
Musiteale kazdy z nich ukoncit strednikom ;

Je to rovnake pravidlo ake sa aplikuje aj mimo prikaz if().
Nepotrebujete vsak strednik za zlozenou zatvorkou uzatvarajucou blok kodu, strednik tiez nedavate za uzataracou zlozenou zatvorkou.

if() - spustenie viacerych prikazov ak je if true

Priklad ukazuje klauzulu if(), ktora spusti niekolko prikazov, ak bude testovaci prikaz true:

			


			
		

Toto sa vytlaci vzdy.
Welcome aboard, trusted user.
Toto sa vytlaci len v pripade ze \$logged_in je true
Toto sa tiez vytlaci vzdy

if() a else {}
else {} ak to neplati {urob toto}

Ak chcete vpripade ze je testovaci vyraz if() false spustit nejake ine prikazy, pridajte do prikazu if() klauzulu else:

			


			
		

Howdy, stranger.

V priklade saprvy prikaz print vykona len vtedy ak testovaci vyraz if() (premenna $logged_in) je true.
Druhy prikaz print (vnutri klauzuli else) sa spusti len vtedy ak je testovaci vyraz false.

if() a elseif()
ak(plati toto) a ked neplati to,ale ak(plati toto)

Konstrukciu if() a else je mozne rozsirit o elseif().
S prikazom if() mozete sparovat jednu alebo aj niekolko konstrukcii elseif() a otestovat tak samostatne viac podmienok viz priklad:

			

			
		

Drahy cudzinec, mas nove spravy.

Pre danu sadu prikazov if() a elseif() sa spusti najviac JEDEN BLOK KODU, prveho z prikazov ktoreho testovacivyraz je true.
Ak je true testovaci vyraz prikazu if(), ziadny z blokov kodu elseif() sa uz nespusti, aj ked ich testovacie vyrazy budu true

if() a elseif() a else
ak(toto) a inak ak (toto) a inak

S elseif() mozete pouzit prikaz else ,ak chcete zaradit blok kodu, kt. sa spusti len vtedy ked ZIADNY Z TESTOVACICH VYRAZOV if() a elseif() NEBUDE TRUE

			

			
		

Netusim kto si, nemas ziadnuspravu, ani nudzovu.

Zostavovanie zlozitych rozhodnuti

Porovnavacie a logicke operatori v PHP pomahaju davat dokopy zlozitejsie vyrazy, o kt. moze konstrukcia if() rozhodnut. Tieto operatory umoznuju porovnavat hodnoty, negovat hodnoty a retazit dokopy niekolko vyrazov vovnutri jedineho prikazu if().

Operator je rovne sa pise == vrati true ak dve hodnoty ktore testujete su si rovne. Hodnotami mozu byt PREMENNE alebo LITERALY:

AK tak toto, AK tak toto, Ak tak toto:

				

				
			

Mas desat novych sprav
Mnam! Milujem morske potvory.

Priradenie vz. porovnavanie
Davajte si pozor aby ste nepouzili =, ked mate na mysli ==. Jedno rovnasa priraduje hodnotu a vracia priradenu hodnotu. Dva znaky rovna sa vsak testuju rovnost a vracaju true ak su hodnoty rovnake. Ak pouzijete v if len jedno rovna sa vysledkom bude taky kod ktory bude vzdycky true.

Opacnym operatorom k je rovno je != vrati true ak dve hodnoty ktore porovnavate niesu si rovne.

				

				
			

Nemas desat novych sprav

S operatormi mensi nez < vacsi nez > mozete porovnavat mnozstvo. Operatorom < a > sa podobaju mensi alebo rovny <= , vacsi alebo rovny >= :

				

				
			

Mas viac jak 17 rokov
kurva zima
je menej jak 20.3 kelvinov

Cisla v pohyblivej radovej ciarke sa interne ukladaju tak ze mozu byt trosicku ine nez su ich priradene hodnoty. Napriklad 50.0 moze byt interne ulozene ako 50.00000002. Ked chcete otestovat ci su dve cisla s desatinnou ciarkou sebe rovne,robte to tak ze otestujetecisa lisia o menej nez je nejaky (v danom priklade prijatelny) prah presnosti. Netestujte operatorom je rovne.
Ak napriklad porovnavate penazne ciastky, moze takym prijatelnym prahom rozlisitelnosti byt 0.00001. Dalsi priklad ukazuje jak porovnavat dve desatinne cisla:

$cena_1 a $cena_2 su rovnake.

Funkcia abs() vracia absolutnu hodnotu svojho argumentu.

Operatory vacsi ako >, a mensi ako ( a ich partneri vacsi alebo rovny a mensi aleborovny) sa mozu aplikovat na cisla alebo na retazce. Retazce sa obvykle porovnavaju takako keby sa vyhladavali v slovniku. Retazec ktory sa v slovniku objavy skorej je MENSI NEZ retazec , ktory sa v slovniku objavy neskorej.:

				

				
			

Tvoje slovo nieje cookie.Neviem proste tvoje slovoje blablabla.

Pri porovnavani retazcov obcas mozu vznikat neocakavane vysledky, ak retazce obsahuju len cisla, alebo zacinaju na cisla. Ked PHP engine uvidiretazce tohoto druhu, prevedie ich pred samotnym porovnanim na cisla. automatickou konverziu vidite v nasledujucompriklade.:

				

				
			

String "x54321" je mensi ako string "x5678". - false
String "54321" je vacsi ako string "5678". - true
String "6 balenie" je vacsi ako string "55 kusov". - false
String "6 balenie" je mensi ako cislo 55. - true



V prvom teste, pretoze oba retazce zacinaju pismenom sa povazuju za normalne retazceaporovnaju sa v slovnikovom poradi.
Ich prve dva znaky (x5)su rovnake ale treti znak prveho slova (4) je mensi jak treti znak druhehoslova (6),takze porovnanie vacsi nez vrati false.


V druhom teste sa oba retazce skladaju len z cislic, takze sa porovnaju tak ako keby to boli cisla. Cislo 54321 je vacsie ako cislo 5678, takze porovnanie vacsi nez vrati true.


V tretom teste, pretoze sa retazce skladaju z cislic a inych znakov, sa opat povazuju za retazce a porovnaju sa podla slovnikoveho poradia.
Cislica 6 je v slovnikovom enginu za cislicou 5, takze test mensi nez vrati false.


V poslednom teste prevedie PHP engine retazec 6 pack na cislo 6 a potom ho porovna s cislom 55 v ciselnom poradi. Pretoze 6 je mensie ako 55,test mensi nez vrati true.

Ak si chcete zaistit aby PHP engine porovnal retazce podla slovnikoveho poradia bez akychkolvek zakulisnych konverzii na cisla, zavolajte funkciu strcmp() ta vzdy porovnava svoje argumenty v slovnikovom poradi.

POROVNAVANIE RETAZCOV, KT. NEOBSAHUJU LEN ZNAKY Z ASCII TABULKY !!!

Zapamatajte si ze retazce v php su iba postupnosti bajtov. ak potrebujete porovnat retazce, kt. pismena nenajdete v slovniku anglickeho jazyka. Potom normalne operatory a funkcie pre porovnavanie retazcov asi pre vas nebudu to prave.Neskorej si preberieme triedu Collator ktora je na to jak stvorena.

Funkcia strcmp() prebera dva retazce vo forme argumentov. Vracia kladne cislo pokial je prvy retazec vacsi ako druhy, alebo zaporne cislo pokial je prvy retazec mensi ako druhy. "Vacsi nez" a "mensi nez" su pre strcmp() definovane slovnikovym poradim. Funkcia vracia 0 ak su si retazce navzajom rovne.:

				

				
			

String "x54321" je less ako string "x5678". - false
String "54321" je less ako string "5678". - false
String "6 pack" je greater ako string "55 card stud". - true
String "6 pack" je greater ako cislo 55. - true

Ked pouzijete strcmp() a slovnikove poradie dostanete v druhom a stvrtom porovnani ine vysledky ako v predchadzajucich testoch. V druhom porovnani strcmp() vypocita ze retazec 54321 jemensi ako 5678, pretoze druhy znak retazcov sa lisi a 4 je pred6.
U strcmp() nezalezi ani na tom ze5678 je kratsi ako 54321 ani ze sajedna o mensie cislo. V slovnikovom poradi je proste 54321 pred 5678.
Stvrte porovnanie sa chova odlisne z toho dovodu ze strcmp() nekonvertuje 6 pack na cislo.
Porovna 6 pack a 55 ako retazec a vypocita ze 6 pack je vacsi pretoze jeho prvy znak je v slovniku dalej ako 5.




OPERATOR < = > (tzv. spaceship)
- porovnava podobnym sposobom ako funkcia strcmp(), samozrejme s tym rozdielom ze pracuje s lubovolnym typom dat.
Vyhodnoti sa na ZAPORNE CISLO ak je lavy operand mensi nez pravy
na KLADNE CISLO ak je pravy operand vacsi
a na 0 ak su si rovne.
				

				
			

-1
1
String "6 pack" je greater than dtring "55 card stud".
String "6 pack" je less ako cislo 55. - false

Operator <=> dodrzuje rovnake pravidlaohladom konverzie retazcov a cisel ako ostatne porovnavacie operatory.
Prevadza "ciselne" retazce na cisla uplne rovnako ako to robia operatory ==, < a ostatne.

Ak chcete negovat pravdivostnu hodnotu, pouzite !, ked date ! pred nejaky vyraz, je to to iste ako keby ste testovali ci sa vyraz rovna false.
V nasledovnom priklade su dva prikazy if() ktore su ekvivalentne:

				

				
			

Not done Yet!
Not done Yet!

Operator negACIE MOZETE POUZIT S AKOUKOLVEK HODNOTOU. Ak je hodnota true, potom jej kombinacia s negacnym operatorom je false.
Ak je hodnota false potom jej kombinacia s negacnym operatorom je true:

				

				
			

$first_name and $last_name are equal.

V tomto priklade sa prikaz v bloku kodu if() vykona len vtedy ak je cely testovaci vyraz true. Ked su si dva retazce predane do strcasecmp() seberovne (nerozlisuju sa male a velke pismena),
strcasecmp() vrati 0, ktora je false.
Testovaci vyraz je operator negacie aplikovany na tuto hodnotu false. Negacia false je true. takze ked budu do funkcie strcasecmp() predane dva retazce, ktore si budu sebe rovne, cely testovaci vyraz bude true.

pomocou logickych operatorov mozete skombinovat viac vyrazov vo vnutri jedneho prikazu if().
logicky operator AND (&&) - testuje dva vyrazy a vracia true len vtedy ak su oba tieto vyrazy true.
Druhy logicky operator OR ( || ) - testuje dva vyrazy a vracia true ak aspon jeden z nich je true.:

				

				
			

Ste príliš starí na zľavu pre deti a príliš mladí na zľavu pre seniorov.
Cas dat si vajcaaa.

Opakovane vykonavanie

Ked pocitacovy program robi nieco opakovane, hovori sa tomu ze je v smycke. Dochadza k tomu velmi casto napriklad ked chcete ziskat sadu riadkov z databaze, vytlacit riadky HTML tabulky, alebo vytisknut polozky HTML menu < select >. Dve konstrukcie smyciek (resp. cyklov), kt. preberieme v dalsej sekcii su while () a for().
Maju sve specifika nicmenej obe vyzaduju, aby ste specifikovali dva podstatne atributy kazdej smycky:
- AKY KOD SA MA VYKONAVAT OPAKOVANE
a
- KEDY SA MA ZASTAVIT

Kod, ktory sa ma vykonavat, je blok kodu uvnitr zlozenych zatvoriek, jako je ten ktory sa dava za konstrukciu if().
Podmienka pre zastavenie smycky je nejaky logicky vyraz, taky jako je testovaci vyraz konstrukcie if().


Konstrukcia while()
- je nieco ako opakujuce sa if(). Do while() pridate nejaky vyraz rovnako ako ho dodavate do if().
Ak je tento vyraz true, blok kodu sa vykona. Narozdiel od if() vsak while() kontroluje vyraz po vykonani kodu znovu. Ak je stale true blok kodu sa vykona znovu (a znovu a znovu tak dlho pokial je vyraz true). Akonahle bude vyraz false, vykonavanie programu prejde na riadky za blokom kodu. Ako uz ste iste uhadli, blok kodu by mal robit nieco co nakoniec ZMENI VYSLEDOK TESTOVACIEHO VYRAZU,aby smycka (cyklus) nepokracovala nekonecne dlho.

				

				
			

Nez sa rozbehne smycka while(), kod nastavi $i na 1 a vytiskne ovarajucu znacku select.
Testovaci vyraz porovna $i s cislom 10. Kym je $i mensie alebo rovne 10, vykonaju sa dva prikazy uvedene v bloku kodu.
Prvy vytlaci znacku option pre select menu,druhy inkrementuje $i.
Ak by ste vo vnutri v smycke while() neinkrementovali $i, priklad by navzdy tlacil option 1 /option.

Potom co blok kodu vytiskne oprion 10 /option, riadok $i++ sposobi, ze sa $i teraz rovna 11. Vhodnoti sa testovaci vyraz ($i <= 10) pretoze uz neni true (11 neni mensie alebo rovne 10). program pokracuje za blokom kodu while a vytlaci uzatvarajucu znacku /select





PRIKAZ (smycka) for()
- poskytuje sposob jak vykonat rovnake prikazy viac krat

					

					
				

strana 61!!!

V inicializacnoma iteracnom vyraze smyckyfor() mozete kombinovat viac vyrazov. Jednotlive vyrazy sa oddeluju ciarkou. Obvykle sa to robi vtedy, ak chcete v priebehu vykonavania smycky menit viac premennych