Načrtovanje in razvoj spletnih aplikacij

Zanka FOREACH

Zanka foreach omogoča prehod skozi elemente polja ali druge iterabilne strukture. Pri vsaki ponovitvi lahko dobimo samo vrednost trenutnega elementa ali pa hkrati ključ in vrednost.

Ta zanka je posebej uporabna pri delu s polji, ker ni treba ročno skrbeti za števec, kot pri zankah for ali while. Zato je zapis pogosto preglednejši in lažje razumljiv.

Pomni: Zanko foreach najpogosteje uporabljamo takrat, ko želimo pregledno obdelati vse elemente polja.

Osnovna pravila

  • Zanko foreach uporabljamo za prehod skozi vse elemente polja.
  • V zanki lahko uporabljamo samo vrednost elementa ali pa ključ in vrednost.
  • Števca pri zanki foreach ni treba določati ročno.
  • Zanka se izvede tolikokrat, kolikor elementov vsebuje polje.
  • Za pravilno delovanje mora biti spremenljivka, nad katero izvajamo zanko, polje ali druga iterabilna struktura.

Pozor: Če zanko foreach uporabimo nad vrednostjo, ki ni primerna za iteracijo, PHP sproži opozorilo.

Osnovni obliki zanke foreach

V praksi najpogosteje uporabljamo dve osnovni obliki. V prvi dobimo samo vrednost elementa, v drugi pa ključ in vrednost.

foreach ($tabela as $vrednost) {
   // blok kode
}

foreach ($tabela as $indeks => $vrednost) {
   // blok kode
}

Pomni: Če ključa ne potrebujemo, uporabimo krajši zapis samo z vrednostjo.

Primer z numeričnim poljem

Pri numeričnem polju je ključ običajno številski indeks. V zanki lahko izpišemo indeks in pripadajočo vrednost.

<?php
$tabela = array('jabolko', 'hruška', 'jagoda');

foreach ($tabela as $indeks => $vrednost) {
    echo "Na indeksu $indeks je $vrednost.<br>";
}
?>
Na indeksu 0 je jabolko.
Na indeksu 1 je hruška.
Na indeksu 2 je jagoda.

Pomni: Pri numeričnem polju lahko zanka foreach vrne indeks elementa in njegovo vrednost.

Primer z asociativnim poljem

Pri asociativnem polju ključ ni številka, ampak beseda ali drug niz. Zanka foreach je zelo primerna za pregledno obdelavo takih podatkov.

<?php
$starost = array();
$starost["Janez"] = 28;
$starost["Mojca"] = 16;
$starost["Miha"] = 35;
$starost["Alenka"] = 46;
$starost["Mirko"] = 34;

foreach ($starost as $indeks => $vrednost) {
    echo "Ime: $indeks, Starost: $vrednost<br>";
}
?>
Ime: Janez, Starost: 28
Ime: Mojca, Starost: 16
Ime: Miha, Starost: 35
Ime: Alenka, Starost: 46
Ime: Mirko, Starost: 34

Pomni: Pri asociativnem polju zanka foreach vrne ključ in pripadajočo vrednost.

Iteracija samo po vrednostih

Če ključa ne potrebujemo, lahko v zanki uporabimo samo spremenljivko za vrednost. Tak zapis je krajši in pogosto preglednejši.

<?php
$barve = array("rdeča", "zelena", "modra");

foreach ($barve as $barva) {
    echo $barva . "<br>";
}
?>

Pozor: Če potrebujemo tudi ključ elementa, zapis samo z vrednostjo ni dovolj.

Iteracija po referenci

V zanki foreach lahko elemente obdelujemo tudi po referenci. To pomeni, da lahko neposredno spreminjamo vrednosti v polju.

<?php
$stevila = array(1, 2, 3);

foreach ($stevila as &$stevilo) {
    $stevilo = $stevilo * 2;
}

unset($stevilo);

foreach ($stevila as $vrednost) {
    echo $vrednost . " ";
}
?>

Po iteraciji po referenci je priporočljivo uporabiti unset() za referenčno spremenljivko, da se izognemo neželenim učinkom pri poznejši uporabi iste spremenljivke.

Pozor: Če po iteraciji po referenci ne uporabimo unset(), lahko ista spremenljivka pozneje povzroči nepričakovano spreminjanje podatkov.

Primerjava različnih načinov uporabe

Način uporabe Kdaj ga uporabimo Primer
samo vrednost ko potrebujemo le vsebino elementov foreach ($barve as $barva)
ključ in vrednost ko potrebujemo tudi indeks ali ključ foreach ($polje as $k => $v)
po referenci ko želimo elemente neposredno spreminjati foreach ($polje as &$v)

Pomni: Izbira oblike zanke foreach je odvisna od tega, ali potrebujemo samo vrednost, tudi ključ ali pa želimo vrednosti spreminjati.

Kdaj uporabimo foreach

Zanko foreach uporabimo takrat, ko želimo pregledno prehoditi vse elemente polja ali druge iterabilne strukture. Pogosto je to najbolj naravna izbira pri delu s seznami podatkov.

V primerjavi z zankama for in while je pri delu s polji pogosto enostavnejša, ker ne zahteva ročnega upravljanja števca in pogoja ponavljanja.

Pomni: Za preprost prehod skozi vse elemente polja je foreach pogosto najbolj pregledna izbira.

Priporočila

  • Zanko foreach uporabljamo predvsem pri delu s polji.
  • Če ključa ne potrebujemo, uporabimo krajši zapis samo z vrednostjo.
  • Če potrebujemo tudi ključ ali indeks, uporabimo zapis s ključem in vrednostjo.
  • Iteracijo po referenci uporabljamo premišljeno in po njej praviloma uporabimo unset().
  • Kodo v zanki pišemo pregledno in z razumljivimi imeni spremenljivk.

Pozor: Nepregledna imena spremenljivk v zanki zmanjšajo razumljivost kode, še posebej pri daljših programih.

Pogoste napake

  • Zanka foreach se uporabi nad spremenljivko, ki ni polje ali druga iterabilna struktura.
  • Pričakuje se ključ elementa, čeprav je uporabljen zapis samo z vrednostjo.
  • Pri iteraciji po referenci se po zaključku zanke ne uporabi unset().
  • V zanki se nehote spreminjajo podatki, čeprav spremembe niso bile predvidene.
  • Za preprost prehod skozi polje se uporabi manj pregleden pristop z ročnim števcem, čeprav bi bila zanka foreach primernejša.

Pozor: Najpogostejše težave pri uporabi zanke foreach nastanejo zaradi neustrezne izbire oblike zanke ali zaradi nepazljive uporabe referenc.

Sklep

Zanka foreach je zelo pomembno orodje za delo s polji v PHP. Omogoča pregleden prehod skozi elemente, poenostavi kodo in zmanjša potrebo po ročnem upravljanju števca. Pri njeni uporabi je pomembno razumeti razliko med iteracijo po vrednosti, iteracijo s ključem in vrednostjo ter iteracijo po referenci.