PHP/Instrukcja foreach: Różnice pomiędzy wersjami
Usunięta treść Dodana treść
m Anulowanie wersji nr 179007 utworzonej przez 83.10.252.10 (dyskusja) |
Nie podano opisu zmian |
||
Linia 4:
Ostatnią pętlą jest foreach. Ma ona specyficzne zastosowanie, ponieważ służy wyłącznie do przeglądania zawartości typów złożonych: tablic oraz obiektów. Kod wewnątrz niej jest powtarzany dla każdego z elementów tablicy, a on sam jest na ten czas przenoszony do tworzonej przez pętlę zmiennej. Wróćmy do naszego przykładu z pętlą for odczytującego zawartość pliku. Przepiszemy go z wykorzystaniem foreach:
<
$plik = file("plik.txt");
Linia 13:
}
echo '</ul>';
</syntaxhighlight>
Teraz skrypt ma o wiele bardziej przejrzystą budowę. Przyjrzyjmy się deklaracji pętli:
<
</syntaxhighlight>
Mówi nam ona, że pętla ma analizować tablicę <code>$plik</code>, a aktualnie przetwarzany element ma być zapisany w zmiennej <code>$linia</code>.
Linia 24:
Foreach umożliwia nam także zwracanie nazw indeksów elementów:
<
$plik = file('plik.txt');
Linia 33:
}
echo '</ul>';
</syntaxhighlight>
Foreach ma tę przewagę nad innymi pętlami, że wie, jakie elementy należą do tablicy i zawsze przetworzy tylko je. Gdybyśmy przed wyświetleniem pliku usunęli z niego np. linijkę 1, pętla for nie dałaby rady, próbując przetworzyć nieistniejący element. Nie robi oczywiście tego dla złośliwości, lecz dlatego, że operuje na liczniku i nie wie, do czego jest on przez nas dalej wykorzystywany.
<
$plik = file('plik.txt');
unset($plik[1]); // usuwamy linijkę o indeksie 1
Linia 46:
}
echo '</ul>';
</syntaxhighlight>
Tworzone przez foreach zmienne są jedynie kopiami oryginalnych wartości, dlatego próba ich modyfikacji wewnątrz pętli w żaden sposób nie wpłynie na zawartość tablicy:
<
$plik = file('plik.txt');
Linia 61:
var_dump($plik);
echo '</pre>';
</syntaxhighlight>
Wewnątrz pętli próbujemy przypisać wartość do zmiennej <code>$linia</code>. Owszem, udaje nam się to, ale nowa treść nie trafia w ogóle do tablicy i systemowe wyświetlenie jej zawartości ukazuje brak jakiejkolwiek reakcji. Czy zatem możliwe jest dokonywanie przypisań wewnątrz foreach? Oczywiście. Są dwie sztuczki. Pierwsza polega na wykorzystaniu zwracanego przez pętlę indeksu. Pousuwajmy z tablicy zbędne białe znaki:
<
$plik = file('plik.txt');
Linia 77:
var_dump($plik);
echo '</pre>';
</syntaxhighlight>
Rozwiązanie to jest nieco trikowe, ale działa. Możemy jednak zastosować coś innego. PHP posiada pewien element zwany referencją. Ogólnie rzecz biorąc jest to odnośnik do zmiennej, który zachowuje się tak, jak ona. Modyfikacja referencji powoduje także modyfikację oryginalnego elementu. Począwszy od PHP 5, referencje można używać w pętli foreach. Wystarczy poprzedzić w jej deklaracji zmienną <code>$linia</code> znakiem <tt>&</tt>:
<
$plik = file('plik.txt');
Linia 92:
var_dump($plik);
echo '</pre>';
</syntaxhighlight>
Teraz modyfikacja zmiennej <code>$linia</code> jest równoznaczna z modyfikacją aktualnego elementu w tablicy <code>$plik</code>, ponieważ zmienna jest takim właśnie odnośnikiem. O referencjach szerzej powiemy w rozdziale '''Inne elementy składni'''.
|