PHPPamokos.lt


8. Masyvai ir jų naudojimas

Įsivaizduokite, kad jums reikia išsaugoti ir apdoroti didelį duomenų kiekį. Sakykime, reikia kažkur išsaugoti visų klasės mokinių kontrolinio pažymius. Galima, be abejo, padaryti tai per daug kintamųjų:

$petriukas = 10;
$maryte = 8;
$blogas_mokinys = 2;

Bet taip yra nepatogu, juk tada, skaičiuojant klasės vidurkį, reikės atlikti veiksmus su kiekvienu kintamuoju. Čia į pagalbą ateiną kintamųjų masyvai (angl. "arrays"), kurie leidžia išsaugoti daug tos pačios struktūros duomenų viename kintamajame.

Kaip saugoti duomenis masyvuose

Masyvuose saugomi duomenys turi pavidalą raktas-reikšmė, iš praeito pavyzdžio mokinių vardai yra raktai, o jų pažymiai - reikšmės. Kaip tai įrašyti į masyvą:

$pazymiai['petriukas'] = 10;
$pazymiai['maryte'] = 8;
$pazymiai['blogas_mokinys'] = 2;

Raktai gali būti ir paprasti skaičiai:

$pazymiai[0] = 10;
$pazymiai[1] = 8;
$pazymiai[2] = 2;

Jeigu masyvo raktai yra teksto eilutės, o ne skaičiai, tokius masyvus dar kartais vadina "asociatyviais" masyvais arba hash-masyvais.

 

Kaip sukurti masyvą

Bendru atveju sukurti masyvą galima paprastu sakiniu:

$masyvas = array();

Bet toks sukūrimas nėra privalomas, galima tiesiog įrašyti reikšmes į kintamąjį, o PHP interpretatorius pats "supras", kad tas kintamasis yra masyvas.

Dar kitas būdas sukurti masyvą yra iš karto priskiriant reikšmes elementams. Sakykime, jei norime masyvo, aprašančio, kiek grupėje studentų yra iš įvairių Lietuvos miestų, galima tai aprašyti taip:

$studentai = array("Vilnius" => "15", "kaunas" => "10", "vievis" => 5);

O jeigu tokiame pačiame pavyzdyje norite saugoti tik skaičius iš eilės, nesaugodami konkrečių miestų, tai masyvo sukūrimas yra dar paprastesnis:

$stud = array(15, 10, 5);
// tai yra tas pats kas $stud[0] = 15; $stud[1] = 10; $stud[2] = 5;

Atkreipkite dėmesį, kad bendru atveju masyvo elementų skaičiavimas prasideda ne nuo 1, o nuo 0. Tai bus svarbu, apdorojant informaciją masyvuose.

Taip pat pravartu žinoti, kad nuo versijos PHP 5.4 atsirado trumpesnis masyvo sukūrimo variantas - taip vadinamas "short syntax". Vietoje žodžio array() užtenka apgaubti masyvą tarp kvadratinių skliaustų [ ] ir PHP automatiškai supras, kad čia masyvas:

Taigi, vietoje

$stud = array(15, 10, 5);

... galime rašyti trumpiau:

$stud = [15, 10, 5];

Bet prieš naudodami tokią sintaksę - įsitikinkite, kokia PHP versija jūsų serveryje.

 

Kaip papildyti masyvą

Jeigu jau turite užpildytą masyvą ir norite pridėti dar vieną elementą, tai tiesiog parašykite taip:

$stud[] = 8;
// reikšmė įrašoma, pridedant prie paskutinio rakto +1: $stud[3] = 8;

Viena svarbiausių ir dažniausiai naudojamų masyvų funkcijų yra count($masyvas), kuri grąžina elementų skaičių tame masyve.

Pavyzdys:

$masyvas = array(10, 8, 9, 7);
$masyvas[] = 2;
echo count($masyvas);
// į ekraną bus išvestas skaičius 5, nes masyve yra penki elementai
 

Vidurkio skaičiavimas: masyvo apdorojimas cikle FOR

Taip, šiek tiek panagrinėjome teoriją, o dabar - praktinis pavyzdėlis. Paskaičiuokime klasės pažymių vidurkį, kai visi pažymiai yra saugomi masyve. Kadangi skaičiuojame vidurkius, tai konkrečių mokinių vardai yra nesvarbūs, svarbiausi yra pažymiai. Tuo pačiu kode panaudosime ciklą FOR, apie kurį buvo rašyta praeitame skyrelyje.

Taigi:

$pazymiai = array(10, 8, 7, 2, 4, 10, 9, 8, 7, 5, 6, 7, 8, 9, 10, 3);
// užpildome duomenis
$suma = 0; // pažymių suma - pradžioje ji lygi nuliui
$pazymiu_skaicius = count($pazymiai); // kiek iš viso turime pažymių
for ($i=0; $i < $pazymiu_skaicius; $i++) {
  $suma = $suma + $pazymiai[$i];
  // prie sumos pridedame einamąjį pažymį su elementu $i
}
$vidurkis = $suma / $pazymiu_skaicius; // skaičiuojame vidurkį
echo $vidurkis; // rodomas galutinis atsakymas

Teisingumo dėlei, galima paminėti, kad yra speciali funkcija masyvo elementų vidurkio skaičiavimui, bet šiame pavyzdyje norėjau parodyti, kaip tai galima padaryti, panaudojant ciklą.

 

Masyvai su tekstiniais raktais: ciklas FOREACH

Darbui su masyvais yra sukurtas specialus ciklas, kuris vadinasi FOREACH - jį trumpai paminėjome praeitame skyrelyje. Vienas iš variantų jį naudoti - kai masyvo raktai yra ne skaičiai, o žodžiai. Pavyzdžiui, jeigu norite į ekraną išvesti pažymius kartu su mokinių vardais:

$pazymiai['petriukas'] = 10;
$pazymiai['maryte'] = 8;
$pazymiai['blogas_mokinys'] = 2;
foreach ($pazymiai as $vardas => $pazymys) {
  echo $vardas . " - " . $pazymys . "<br />";
}

Kaip matome, FOREACH užrašymas yra toks: foreach ($masyvas as $raktas => $reiksme). Kitaip tariant, ciklas tiesiog pereina per visus masyvo elementus, kiekvieną elementą įrašydamas į du kintamuosius - į rakto kintamąjį ir reikšmės kintamąjį. O ciklo viduje jūs jau sprendžiate, ką daryti su tais dviem kintamaisiais.

FOREACH taip pat gali būti naudojamas ir "paprastiems" masyvams, kur raktų reikšmės yra skaičiai, bet jums nesvarbu kokie jie yra - tiesiog reikia pereiti per masyvą ir padaryti kažką su jo elementais.

$pazymiai = array(10, 9, 10, 7);
foreach ($pazymiai as $pazymys) {
  echo $pazymys . " ";
}

Toks ciklas yra realiai tik trumpesnis užrašymas FOR ciklo:

$pazymiai = array(10, 9, 10, 7);
for ($i=0; $i < count($pazymiai); $i++) {
  echo $pazymiai[$i] . " ";
}
 

Pagalbinės funkcijos darbui su masyvais

Jau matėte, kaip veikia funkcija count(), skaičiuojanti masyvo elementus. Bet be jos yra dar daugybė naudingų funkcijų, kurias galima panaudoti su masyvais. Parodysime su pavyzdžiais:

$pazymiai = "10,8,9,7";
$masyvas = explode(",", $pazymiai);

Funkcija explode(): skaido eilutę į elementus pagal kablelį ir įrašo į masyvą.

$masyvas = array(1,2,3,4,5);
$eilute = implode("-" , $masyvas);

Funkcija implode() sudaro eilutę iš masyvo elementų, atskirdamas brūkšniu.

$masyvas = array(9,8,7,9,5,2,8);
if (in_array(10, $masyvas)) { echo "Yra dešimtukų"; }

Funkcija in_array() tikrina, ar masyve yra nurodyta reikšmė

sort($masyvas);

Funkcija sort() surūšiuoja masyvo elementus didėjančia tvarka.

Funkcijų yra ir daug daugiau, visas jas galite rasti oficialiame PHP puslapyje.

 

Masyvas masyve, arba multidimensional arrays

Vėlgi užsiminsiu apie filmą "Inception" - ši tema bus kažkiek panaši. Esmė tokia, kad masyvo elemento reikšmė gali būti bet kas: skaičius, teksto eilutė, tuščia reikšmė. O kodėl negali būti masyvas? Gali! Ir ši tema svarbi dėl to, kad tokie multidimensional masyvai naudojami labai dažnai, sudėtingesnėms duomenų struktūroms saugoti. Tokius masyvus galima pavadinti labai nedidelėmis duomenų bazėmis.

Sakykime, mums reikia saugoti mokinių sąrašą ir jų duomenis - apie kiekvieną mokinį būtų vardas, pavardė ir pažymių vidurkis. Tokio masyvo sukūrimas atrodys taip:

$mokiniai = array(
  array(
    'name' => 'Petriukas',
    'surname' => 'Jonaitis',
    'average' => '7.98'
  ),
  array(
    'name' => 'Joniukas',
    'surname' => 'Petraitis',
    'average' => '8.43'
  ),
  array(
    'name' => 'Marytė',
    'surname' => 'Marytaitė',
    'average' => '9.72'
  )
);

Ir tada patogiai galime išvesti į naršyklę mokinių lentelę su pažymiais, ciklų pagalba:

foreach ($mokiniai as $mok) {
  echo $mok['name'] . ' ' . $mok['surname'] . ': ' . $mok['average'] . '<br />';
}


(c) 2015-2018. Visais klausimais kreipkitės povilas@laraveldaily.com