czwartek, 21 lipca 2011

foreach() i for() - subtelna różnica


Pewnie dla wielu osób, które z php mają do czynienia od dłuższego czasu, ten wpis nie będzie niczym odkrywczym.
Czym różni się foreach() od for()? W wielu przypadkach nie ma żadnej różnicy dla logiki aplikacji, której pętli się stosuje i można je stosować zamiennie bez wpływu na jej działanie.

Więc gdzie jest różnica? Otóż foreach() przechodzi po elementach tablicy w kolejności dodawania wartości, natomiast for() jest używany do iterowania tablicy w zdefiniowany przez nas sposób.
Poniższy kod wyjaśnia wszystko:
<?php
$a = array();
$a[3] = 'a';
$a[1] = 'b';
$a[0] = 'c';
$a[2] = 'd';

$arrayCount = count($a);

echo "FOR: \n";
for ($key = 0; $key < $arrayCount; $key++)
    echo 'key: ' . $key . ', value: ' . $a[$key] . "\n\n";

echo "FOREACH: \n";
foreach ($a as $key => $value)
    echo 'key: ' . $key . ', value: ' . $value . "\n";

Wykonanie go daje taki wynik:
FOR:
key: 0, value: c
key: 1, value: b
key: 2, value: d
key: 3, value: a

FOREACH:
key: 3, value: a
key: 1, value: b
key: 0, value: c
key: 2, value: d

5 komentarzy:

  1. Wpis ukazuje brak wiedzy autora.

    Pętla for() nie iteruje po elementach tablicy! Przechodzi ona przez kolejne elementy zadanej sekwencji (w tym przypadku od 0 do n). To, że wewnątrz pętli dobierasz się do elementów tablicy pod konkretnym identyfikatorem to już inna sprawa.

    Druga sprawa to fakt, że pętla for() wcale nie musi ustawiać wartości rosnąco lub malejąco. Przykład:

    for ($i=1; $i<10; $i = ($i + ($i > 0 ? 1 : -1)) * -1) {
    echo $i."\n";
    }

    Pozdrawiam :)

    OdpowiedzUsuń
  2. Mój błąd, dzięki za dobitne wyprostowanie:) Wpis został zmieniony tak, że nie zawiera już rażącego błędu:)

    OdpowiedzUsuń
  3. imo powinieneś również wspomnieć o kwestii wydajności obu tych rozwiązań, różnica jest spora...

    OdpowiedzUsuń
  4. $key < count($a)
    ałć.... ale wiesz, że count($a) będzie wykonywany za każdym obrotem pętli? To co napisałeś podają jako przykłady nieoptymalnego kodu a Ty tym uraczasz początkujących ;)
    Liczbę elementów tablicy należy wyliczyć przed pętlą i wpętli operować już na tej wyliczonej wartości

    OdpowiedzUsuń
  5. @nospor
    Oczywiście poprawka naniesiona. Co za wstyd:P

    OdpowiedzUsuń