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:
 
<sourcesyntaxhighlight lang="php" line><?php
$plik = file("plik.txt");
Linia 13:
}
echo '</ul>';
</syntaxhighlight>
</source>
 
Teraz skrypt ma o wiele bardziej przejrzystą budowę. Przyjrzyjmy się deklaracji pętli:
 
<sourcesyntaxhighlight lang="php" line start="5">foreach($plik as $linia)
</syntaxhighlight>
</source>
 
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:
 
<sourcesyntaxhighlight lang="php" line><?php
$plik = file('plik.txt');
Linia 33:
}
echo '</ul>';
</syntaxhighlight>
</source>
 
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.
 
<sourcesyntaxhighlight lang="php" line><?php
$plik = file('plik.txt');
unset($plik[1]); // usuwamy linijkę o indeksie 1
Linia 46:
}
echo '</ul>';
</syntaxhighlight>
</source>
 
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:
 
<sourcesyntaxhighlight lang="php" line><?php
$plik = file('plik.txt');
Linia 61:
var_dump($plik);
echo '</pre>';
</syntaxhighlight>
</source>
 
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:
 
<sourcesyntaxhighlight lang="php" line><?php
$plik = file('plik.txt');
Linia 77:
var_dump($plik);
echo '</pre>';
</syntaxhighlight>
</source>
 
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>:
 
<sourcesyntaxhighlight lang="php" line><?php
$plik = file('plik.txt');
Linia 92:
var_dump($plik);
echo '</pre>';
</syntaxhighlight>
</source>
 
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'''.