Igal pool, kus iganes Sa ei viibiks!
Twitter | Github | phpBB.com - Eesti | phpBBeesti.eu Foorum | Facebook | DISCORD Chat

demo32 (3.2 on arenduses) - demo31 (3.1 on praegune live versioon)

phpBB - 1 tarkvara - üle 100 laienduse - eesti keeles - t a s u t a
phpBB - lokaliseeritud aastast 2008*!
*Erinevate haldajate käe all. Vaata lehekülge meist.

Be Here, Be Now, Be INSIDE phpBB!

Welcome to phpBB Estonian Translation Team


Are you a fan of phpBB? Do you have enthusiasm for translation work? If you do, we would love to invite you to help us with phpBB volunteer translation. If you want to join our volunteer translation team, please contact us by FB/TW DM or at et.translations@phpbbeesti.net

PHP Algajatele #3.

Arutelud veebidisaini teemadel, mis kasutavad HTML / XHTML ja CSSi, ning üldistel graafika teemadel, nagu näiteks Photoshop ja teised.

Moderaator: Tugi

doozy
Postitusi: 409
Liitunud: 13 Mai 2014, 08:00
Asukoht: Tallinn
Sugu: Määratlemata

PHP Algajatele #3.

PostitusPostitas doozy » 09 Mai 2015, 20:07

TÄHELEPANU! Postituse algne autor on Traf, phpBB.ee foorumist, kes tegi postituse 26 Mai 2008, 22:28! Kõik õigused kuuluvad talle!

Täna on järjekordselt aeg teha uus php tund. Eelmine kord sai ülesandeks antud funktsioonide kasutamine. Oli neid, kellel oli natuke raskusi, aga tehtud said kõik. Vastuseid laekus neljalt inimeselt. Tuletan siinkohal meelde - õigem oleks olnud öelda seda eelmise tunni lõpus küll - et kui tahtmine PHP'ga koduseks saada, siis ainult tunni lõpus antud ühest ülesandest ei piisa. Soovitan alati harjutada ja katsetada erinevaid variante juba omandatud materjali põhjal. Kõikide selliste katsetamiste käigus tekkinud küsimustele leiame alati ka vastuse, sest alati on võimalus, et usin katsetaja mõne kombinatsiooni otsa satub, millele tunnis endas vastust ei leia. Parem praegu, kui hiljem :)

Eelmine tund

Läheme eelmise tunni ülesande lahenduse juurde ja vaatluse alla võtame seekord kenno pakutu. Kõik saabunud lahendused toimisid sama loogika järgi, seega olulisi erinevusi ma nendes ei märganud.

Kood: Vali kõik

<?php
    function moodas($paev, $kuu, $aasta) {

    $a = $paev - 1; // ei loe esimest jaanuarit sisse
    $b = ($kuu - 1) * 30;
    $c = ($aasta - 2000) * 360;

    return $a + $b + $c;

    }
   
echo 'Täna, 3.5.2001 on möödunud ' . moodas(3, 5, 2001). ' päeva.';
?>


Kuidas annaks antud koodi parandada? Märkame, et kuupäev 3.5.2001 esineb koodis kahel korral, mis on selgelt liiga palju vaeva (:P), hea oleks ühega hakkama saada. Lisaks muutub mitme kuupäeva väljastamine nii jube tüütuks. Esialgne lahendus oleks panna ka teksti väljastamine funktsiooni sisse, selliselt:

Kood: Vali kõik

<?php
    function moodas($paev, $kuu, $aasta) {

    $a = $paev - 1; // ei loe esimest jaanuarit sisse
    $b = ($kuu - 1) * 30;
    $c = ($aasta - 2000) * 360;

    $vastus = $a + $b + $c;
    echo 'Täna, ' . $paev . '.' . $kuu . '.' . $aasta . ' on möödunud ' . $vastus . ' päeva.';
    }
   

?>


Antud lahendus ka toimib, kuid ainult seni, kuniks päevade arvutamist ennast mujal vaja ei lähe. Oletame aga, et meil on vaja väljastada teksti mitmes eri vormingus:

Täna, 3.5.2001 on möödunud 413 päeva.
Kuupäevast 1.1.2000 on möödunud 413 päeva.
2001 aasta 5. kuu 3. päeval möödus 413. päev.

Täna, 6.5.2001 on möödunud 416 päeva.
Kuupäevast 1.1.2000 on möödunud 416 päeva.
2001. aasta 5. kuu 6. päeval möödus 416. päev.

Hakata nende jaoks kasutama funktsiooni, mis tagastab päevade arvu, ja siis ülejäänud tekst iga kord ise kirjutada oleks lollus. Teine variant, kus tekst väljastatakse funktsiooni seest, on parem, kuid seal tuleb päevade arv igas funktsioonis uuesti arvutada. Kui tahame ainult päevaarvutamist muuta, tuleb teha seda igas funktsioonis, kus seda kasutame. Vaja läheks midagi nende kahe vahepealset, kus üks funktsioon tegeleb teksti väljastamisega ja teine päevade arvutamisega. Siinkohal avaldan teile ühe saladuse - funktsioone saab välja kutsuda ka teiste funktsioonide seest. :P

Kõigepealt defineerime päevade arvutamise funktsiooni:

Kood: Vali kõik

function moodas($paev, $kuu, $aasta) {
    $a = $paev - 1; // ei loe esimest jaanuarit sisse
    $b = ($kuu - 1) * 30;
    $c = ($aasta - 2000) * 360;
   
    return $a + $b + $c;
}


Seejärel defineerime teksti väljastamise funktsioonid, mis päevade arvutamise funktsiooni kasutavad. Väljakutsutavale funktsioonile anname edasi jällegi päeva, kuu, ja aasta:

Kood: Vali kõik

function esimene($paev, $kuu, $aasta) {
    echo 'Täna, ' . $paev . '.' . $kuu . '.' . $aasta . '
    on möödunud ' . moodas($paev, $kuu, $aasta) . ' päeva.<br/>';
}
function teine($paev, $kuu, $aasta) {
    echo 'Kuupäevast 1.1.2001
    on möödunud ' . moodas($päev, $kuu, $aasta) . ' päeva.<br/>';
}
function kolmas($paev, $kuu, $aasta) {
    echo $aasta . '. aasta ' . $kuu . '. kuu ' . $paev . '.
    päeval möödus ' . moodas($paev, $kuu, $aasta) . '. päev.<br/>';
}


Paneme siinkohal tähele kahte asja: pöördumised järgmisele reale on koodi loetavuse huvides. Tulemust see ei mõjuta, kuna PHP's lõpetab käsu ; märk. Teiseks tuleb hoolikalt jälgida, millised punktid on väljastatava teksti sees ja millised on PHP sidumismärgid. Õnneks aitab meid koodivärvija niipalju, et saame eristada punaseid punkte teksti sees (väljastatav tekst) ja rohelisi tekstist väljas (siduvaid punkte).

Nüüd jääb need funktsioonid veel välja kutsuda:

Kood: Vali kõik

   esimene(2,6,2004);
   kolmas(1,10,2001);
   teine(1,1,2007);
   kolmas(12,11,2002);


Kõik ühes failis koos näeks olukord välja selline:

Kood: Vali kõik

<?php
function moodas($paev, $kuu, $aasta) {
    $a = $paev - 1; // ei loe esimest jaanuarit sisse
    $b = ($kuu - 1) * 30;
    $c = ($aasta - 2000) * 360;
   
    return $a + $b + $c;
}
function esimene($paev, $kuu, $aasta) {
    echo 'Täna, ' . $paev . '.' . $kuu . '.' . $aasta . '
    on möödunud ' . moodas($paev, $kuu, $aasta) . ' päeva.<br/>';
}
function teine($paev, $kuu, $aasta) {
    echo 'Kuupäevast 1.1.2001
    on möödunud ' . moodas($päev, $kuu, $aasta) . ' päeva.<br/>';
}
function kolmas($paev, $kuu, $aasta) {
    echo $aasta . '. aasta ' . $kuu . '. kuu ' . $paev . '.
    päeval möödus ' . moodas($paev, $kuu, $aasta) . '. päev.<br/>';
}

esimene(2,6,2004);
kolmas(1,10,2001);
teine(1,1,2007);
kolmas(12,11,2002);
?>


Nagu näeme, on tulemused juba päris head. Lisaks esimesele, teisele ja kolmandale funktsioonile võib päevade arvutamise funktsiooni kasutada nii teistes funktsioonides kui ka iseseisvalt. Kogu kood on jaotatud tükkideks, millest iga tükk tegeleb ainult temale määratud ülesandega. See säilitab hea ülevaate, kui koodi rohkem hakkab tekkima. Aga läheme edasi järgmise teema juurde, selleks on

Järjendid

Järjend, massiiv, array - heal lapsel mitu nime. Mina kasutan mõistet järjend. Mis see siis ikkagi on? Kõige lihtsamal kujul on tegemist hulgaga, ehk kogumiga üksikutest elementidest. Milleks seda vaja? Tihtipeale tuleb ette olukordi, kus järjendite kasutamine lihtsustab tunduvalt ülesande lahendamist. Võtame näiteks juhuse, kus meil on vaja panna kirja nimekiri õpilastest ja siis see väljastada. Üksikuid muutujaid kasutades näeks see välja selline:

Kood: Vali kõik

$opilane1 = 'Vello';
$opilane2 = 'Mati';
$opilane2 = 'Juhan';
//.....jne

echo $opilane1;
echo $opilane2;
echo $opilane3;
//.......jne     


See on eriti tüütu tegevus. Lahendus - paneme kirja oma esimese järjendi:

Kood: Vali kõik

$opilased = array('Vello', 'Mati', 'Juhan', 'Mihkel', 'Jaanus');


Nüüd on meil järjend $opilased, mis oma olemuselt on hulk õpilaste nimedest. Seda niisama echoga väljastada ei ole võimalik, tegemist ei ole üksiku muutujaga. PHP'l on selle jaoks enda funktsioon print_r(). See annab harva soovitud tulemusi, kuid võimaldab kiirelt aimu saada sellest, mis on järjendi sees. Kasutame seda järjendi $opilased peal:

Kood: Vali kõik

$opilased = array('Vello', 'Mati', 'Juhan', 'Mihkel', 'Jaanus');

print_r($opilased);


Laseme selle käima ja uurime tulemusi. print_r() ei väljasta muu sisu vahele HTML-elemente nagu reavahetus <br/> jne, seega peame korrektse vormingu nägemiseks uurima lähtekoodi, ehk seda koodi, mida PHP reaalselt väljastab. Tulemus on selline:

Array
(
[0] => Vello
[1] => Mati
[2] => Juhan
[3] => Mihkel
[4] => Jaanus
)

Mida me siit välja loeme? Antud on kõik järjendi elemendid (praegusel juhul õpilaste nimed) ning nende ees on indeksarvud. Elemendi indeks on kui järjehoidja, mille kaudu element järjendist kätte saada. See algab nullist ja kasvab iga järgneva elemendiga. Kuidas element järjendist kätte saada? Aga ikka indeksi järgi. Juhan asub kohal kaks (sai kolmandana järjendisse lisatud, seega indeksiga 2; esimene - 0, teine - 1, kolmas - 2 jne), seega Juhani kättesaamiseks kirjutame

Kood: Vali kõik

$opilased[2];


See iseenesest ei tee aga midagi, kasutame teda teksti väljastamisel:

Kood: Vali kõik

echo $opilased[4] . ' õppis täna hästi. ' . $opilased[0] . ' nii hästi ei õppinud';
//väljastab: Jaanus õppis täna hästi. Vello nii hästi ei õppinud   


Peame meeles, et elementidele pääseb ligi nii mitu korda, kui vaja, samamoodi nagu üksikute muutujatega, tingimuseks on see, et see järjend on kusagil eespool koodis kirja pandud. Samuti tuleb meeles pidada, et praegusel juhul ei saa kätte elementi $opilased[5], seda lihtsalt ei ole seal. Lisame prooviks veel paar nime ja õpime korraga, kuidas olemasolevale järjendile uusi liikmeid lisada. Me saame seda teha nii:

Kood: Vali kõik

$opilased[] = 'Kati';


See lisab Kati automaatselt järjendi kõige viimaseks elemendiks, seega praeguse seisuga saame me elemendile $opilased[5] juurde küll. Saab ka ise määrata, millise indeksi element saama peaks, see võimaldab ka olemasolevaid elemente muuta. Näide: Paneme kirja ja jooksutame järgmise koodijupi ning jälgime väljastatud tulemuse lähtekoodi.

Kood: Vali kõik

<?php
//paneme kirja esialgse järjendi
$opilased = array('Vello', 'Mati', 'Juhan', 'Mihkel', 'Jaanus');
//väljastame järjendi
print_r($opilased);
//lisame Kati
$opilased[] = 'Kati';
//lisame Kadri indeksiga 8
$opilased[8] = 'Kadri';
//lisame Mardi
$opilased[] = 'Mart';
//väljastame järjendi
print_r($opilased);
//muudame elemendi indeksiga 1 väärtust
$opilased[1] = 'Karmen';
//väljastame järjendi
print_r($opilased);
?>


Alguses on viis nime, nagu me kirja panime. Teisel väljastamisel oleme me lisanud viimaseks elemendiks (hetkel siis nr 5) Kati, lisanud indeksiga 8 elemendi Kadri ja siis uuesti viimaseks elemendiks Mart. Millise indeksi saab Mart? Nagu välja tuleb, 9, sest kõige suurem indeks oli senimaani 8. Edasi asendame me elemendi 1 nimega Karmen. See asendamine ei erine uue kindlaks määratud indeksiga elemendi lisamisest mittemillegi poolest, seega tuleb ettevaatlik olla, et tõepoolest tegu vaba kohaga oleks. Kõige kindlam on jätta indeks määramata ja lasta uus element lisada automaatselt järjendi lõppu. Uute elementide lisamiseks ei pea tingimata järjendis juba midagi olemas olema, saab ka nii:

Kood: Vali kõik

$opilased = array();
$opilased[] = 'Mati';
$opilased[] = 'Mart';
//....jne     


Nii, mida nüüd järjenditega ette võtta ehk kuidas nad enda tahtmise järgi väljastada? Käsitluse alla tulevad

Tsüklid

Tsükkel võimaldab selle sees olevat koodi korrata soovitud arv kordi. Üks lihtsal kujul tsükkel näeb välja selline:

Kood: Vali kõik

for($i = 1; $i < 10; $i++) {
  echo $i;
}


Jah, see näeb esimest korda peale vaadates välja lihtsalt jube, ma olen selle raja kunagi läbi käinud, aga lähemal tundma õppimisel saab temast üks parimaid sõpru. Antud tsükkel näiteks väljastab arvurea 123456789 . Õpime teda lähemalt tundma.

Kood: Vali kõik

for(enne tsükli algust ; tingimus, et jooksmist jätkata ; peale jooksmisekorda) {
  //kood, mis jookseb
}


Alguses, st enne, kui me tsükliga alustame, loome muutuja $i ja anname talle algväärtuse 1. Ma ei oska öelda, miks tsüklite puhul alati i kasutusele võetakse, aga nii see juba on. See on tegelikult vabalt valitav, $i asemel võib olla ka $j, $alg või $kalamajonees .

Teiseks määrame tingimuse, mille tõesena olemisel tsükkel jätkab oma tööd, väära puhul aga katkestab ja kood jätkab oma naturaalset kulgu tsüklist edasi. Antud juhul ütleme, et $i peab olema väiksem, kui 10.

Lõpetuseks ütleme, mis tuleks teha peale seda, kui kood on ühe korra jooksnud. Antud juhul ütleme, et suurendaks $i väärtust ühe võrra. ($i++ on sama, mis $i = $i+1, laiskuse asi). Paneme tähele, et algus, tingimus ja järeltegevus on eraldatud ; abil. Kui funktsioonide puhul piisas komast, siis siin on reeglid natuke karmimad.

Tsükli elu näeb välja siis selline:
Algväärtustamine $i = 1
kontroll, kas $i < 10
kui on, siis jooksutame koodi
lõpptegevus $i++, suurendame muutujat $i ühe võrra.
kontroll, kas $i < 10
kui on, siis jooksutame koodi
lõpptegevus $i++, suurendame muutujat $i ühe võrra.
kontroll jne, kuniks $i < 10 on vale ja tsükkel katkestab oma töö.

Antud juhul on alguses $i väärtus 1, see väljastatakse, suurendatakse ja väljastatakse kuniks $i väärtus on jõudnud kümneni ja $i < 10 enam ei kehti, tsükli töö ja seega ka väljastamine katkestatakse.

Kes jõuab jälgida, teen siia tsüklite abil korrutustabeli:

Kood: Vali kõik

$ridu = 20;
$veerge = 10;

for($rida = 1;$rida <= $ridu;$rida++) {
    for($veerg = 1;$veerg <= $veerge;$veerg++) {
        echo $rida * $veerg . "\t";
    }
    echo "\n";
}   


Esimene tsükkel teeb ridu, teine tsükkel selle sees aga numbreid selles reas, moodustades veerud. Pole vaja muretseda, kui segaseks jääb, ma tahtsin sellega demonstreerida tsüklite võimalusi :)

Kood: Vali kõik

Tsüklid ja Järjendid


Lõpuks kasutame tsükleid, et väljastada järjendi elemendid. Ühes tüüpilises tsüklis on suurenevad numbrid, samasugused numbrid on järjendis indeksite näol. Alustame nullist (esimese elemendi indeks) ja ütleme, et indeks peab olema väiksem, kui järjendis olevate elementide arv. Kuna viie elemendi puhul on viimaseks indeksiks 4, siis sobib elementide arv tingimusse väga hästi. Elementide arvu järjendis saab teada count() abil. Näide:

Kood: Vali kõik

$opilased = array('Vello', 'Mati', 'Juhan', 'Mihkel', 'Jaanus');
echo count($opilased); //väljastab 5;   


Alustame:

Kood: Vali kõik

$opilased = array('Vello', 'Mati', 'Juhan', 'Mihkel', 'Jaanus');

for($i = 0; $i < count($opilased); $i++) {
     echo $opilased[$i] . '<br/>';
}


Antud kood väljastab kõik järjendi elemendid ja lisab lõppu reavahetuse <br/>

Järjenditest järgmisel korral edasi, praeguse tunni aga lõpetame ülesandega:

Ülesanne

Valmista programm, mille alguses kirjeldad vähemalt 10 nimelise peokülaliste nimekirja. Väljastada tuleb nii külaliste arv kokku kui külaliste nimed koos järjekorranumbriga. Vorminda vastavalt maitsele, kasuta väljastamisel tsüklit.

Ärge kartke ise midagi uut harjutada!

doozy
Postitusi: 409
Liitunud: 13 Mai 2014, 08:00
Asukoht: Tallinn
Sugu: Määratlemata

Re: PHP Algajatele #3.

PostitusPostitas doozy » 09 Mai 2015, 20:08

Teema suletud, kuna tegemist ei ole phpBBeesti.com poolt tehtud postitusega. Tegemist on phpBB.ee kasutaja Traf poolt aastast 2008.


Mine “Veebidisain ja graafika.”

Kes on foorumil

Kasutajad foorumit lugemas: Registreeritud kasutajaid pole ja 1 külaline

phpBB Eesti : Lahtiütlus