PHP/Instrukcja for: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
zamiana prognav->subst:naw
Zyx (dyskusja | edycje)
m aktualizacja formatowania i drobne poprawki merytoryczne
Linia 1:
{{podświetl|php}}
 
{{prognaw|PHP|[[../Instrukcja switch/]]|[[../Instrukcja while/]]}}
 
Linia 15 ⟶ 13:
Oddzielone są one średnikami. Pokażemy to na przykładzie skryptu wyświetlającego liczby od 0 do 9.
 
<nowikisource lang="php" line><?php
for($i = 0; $i < 10; $i++)
{
for($i = 0; $i < 10; $i++)
echo $i.'<br/>';
{
}
echo $i.'<br/>';
</source>
}
?></nowiki>
 
Warunek startu tworzy nową zmienną ''<code>$i''</code> z wartością zero. Następnie określamy, że dopóki ''<code>$i''</code> jest mniejsze od 10, pętla ma się powtarzać. Przy każdym cyklu należy zwiększyć wartość ''<code>$i''</code> o 1.
 
{{Uwaga|Uważaj na warunek końca pętli! Jeżeli niepoprawnie go zdefiniujesz, pętla może nie wykonać się wcale albo też powtarzać się w nieskończoność. Drugi przypadek nie jest aż taki groźny, ponieważ PHP automatycznie przerywa wykonywanie skryptu, jeżeli trwa ono ponad 30 sekund.}}
Linia 36 ⟶ 32:
Widzę i opisuję, bo tęsknię po tobie.
 
Zastosujemy funkcję ''<code>file()''</code>, aby wczytać go do pamięci z jednoczesnym rozbiciem na poszczególne wiersze zapisane w tablicy. W ten sposób będziemy je mogli wyświetlić jako elementy listy wypunktowanej:
 
<nowikisource lang="php" line><?php
$plik = file('plik.txt');
$plik = file('plik.txt');
echo '<ul>';
for($i = 0, $x = count($plik); $i < $x; $i++)
{
echo '<li>'.trim($plik[$i]).'</li>';
}
echo '</ul>';
</source>
?></nowiki>
 
Do określenia ilości wierszy użyliśmy poznanej już wcześniej funkcji ''<code>count()''</code>. Przy wyświetlaniu stosujemy jeszcze jedną: ''<code>trim()''</code>. Usuwa ona z początku i końca każdego wiersza białe znaki, tj. spacje, zejścia do nowej linii, tabulatory. Wynikiem działania skryptu jest zawartość pliku wyświetlona w liście wypunktowanej.
 
Zwróć uwagę na specyficzną budowę wyrażenia inicjacji pętli. Pragniemy utworzyć dwie zmienne, dlatego oddzielamy je przecinkami. Podobną sztuczkę możemy zastosować również w wyrażeniu iteracyjnym. Można się zapytać, dlaczego zastosowaliśmy tak rozbudowaną konstrukcję. Przecież dopuszczalne jest także napisanie:
 
<source lang="php" line start="5">for($i = 0; $i < count($plik); $i++)
</source>
 
W typowych sytuacjach obie konstrukcje zachowają się podobnie, lecz warto pamiętać o pewnym niuansie technicznym. Pierwsza z konstrukcji pobiera ilość elementów tablicy na samym początku. Jeżeli któryś cykl pętli doda jakiś element, nie zostanie on uwzględniony. W drugim przypadku ilość ta jest pobierana po każdym cyklu, zatem pętla dysponuje bieżącymi informacjami o wielkości tablicy i wszelka jej zmiana zostanie uwzględniona w ilości wykonanych cykli. Sposób ten jest jednak mniej wydajny od pierwszego.
Linia 73 ⟶ 68:
Naszym zadaniem jest wprowadzenie komend do tablicy, aby można je było łatwiej przetwarzać. Skrypt ten będziemy pisać kawałek po kawałku. Na początek stwórzmy sobie parę zmiennych:
 
<nowikisource lang="php" line><?php
$tekst = 'Komenda; Komenda; Komenda; Komenda. To już pomijamy.';
$tablica = array(0 => '');
$tekst = 'Komenda; Komenda; Komenda; Komenda. To już pomijamy.';
$tablicat = array(0 => '');
</source>
$t = 0;</nowiki>
 
''<code>$tekst''</code> to tekst do przetworzenia. ''<code>$tablica''</code> jest miejscem docelowym komend z "firmowo" utworzonym pierwszym pustym elementem. ''$t'' to licznik mówiący, do którego elementu tablicy wprowadzamy znaki.
 
Rozpoczynamy pętlę. Do pobrania długości ciągu użyjemy funkcji ''<code>strlen()''</code>. ''<code>$i''</code> to licznik położenia w ciągu tekstowym. Wskazuje na aktualnie przetwarzany znak:
 
<nowikisource lang="php" line start="5"> for($i = 0; $i < strlen($tekst); $i++)
{
{</nowiki>
</source>
 
Implementujemy możliwość pierwszą. Spacje ignorujemy, dlatego przy ich napotkaniu przerywamy aktualny cykl pętli komendą '''continue''' i przechodzimy do następnego:
 
<nowikisource lang="php" line start="7"> if($tekst{[$i}] == ' ')
{
continue;
}</nowiki>
</source>
 
Zauważ, jak odwołujemy się do określonego znaku wewnątrz ciągu: ''<code>$tekst{[$i}'']</code>. Numer znaku (począwszy od zera) podajemy jako indeks w nawiasach klamrowychkwadratowych, identycznie jak w tablicach.
 
Druga możliwość - po napotkaniu kropki przerwać pętlę wcześniej:
 
<nowikisource lang="php" line start="11"> if($tekst{[$i}] == '.')
{
break;
}</nowiki>
</source>
 
Przechodzimy do ewentualności trzeciej. Przy średniku należy przesunąć się na nowy element tablicy wynikowej i zainicjować go pustym ciągiem. Każdy inny znak wprowadzamy do aktualnego elementu tablicy:
 
<nowikisource lang="php" line start="15"> if($tekst{[$i}] == ';')
{
$t++;
$tablica[$t] = '';
}
else
{
$tablica[$t] .= $tekst{[$i}];
}</nowiki>
</source>
 
Teraz dopełnienie formalności, tj. zamknięcie pętli i wyświetlenie zawartości tablicy funkcją ''print_r<code>var_dump()''</code>:
 
<source lang="php" line start="24">}
<nowiki> }
echo '<pre>';
print_rvar_dump($tablica);
echo '</pre>';
?></nowikisource>
 
Zapytajmy się, jak przerwać pętlę, jeżeli jesteśmy aktualnie w instrukcji switch? Wywołanie '''break''' i '''continue''' będzie się przecież odnosiło do niej, a tego nie chcemy. Rozwiązaniem jest podanie po nich numeru określającego, której instrukcji wzwyż dotyczy wywołanie. Przepiszmy jeszcze raz powyższy kod z wykorzystaniem instrukcji wyboru (notabene nawet bardziej pasującej w tym przypadku):
 
<nowikisource lang="php" line><?php
$tekst = 'Komenda; Komenda; Komenda; Komenda. To już pomijamy.';
$tablica = array(0 => '');
$t = 0;
for($i = 0; $i < strlen($tekst); $i++)
$tekst = 'Komenda; Komenda; Komenda; Komenda. To już pomijamy.';
{
$tablica = array(0 => '');
switch($tekst{[$i}])
$t = 0;
{
case ' ':
for($i = 0; $i < strlen($tekst); $i++)
continue 2;
{
case '.':
switch($tekst{$i})
break 2;
{
case ' ;':
continue 2$t++;
case$tablica[$t] = '.':;
break 2;
case ';'default:
$tablica[$t] .= $tekst{[$i}];
$t++;
}
$tablica[$t] = '';
}
break;
default:
$tablica[$t] .= $tekst{$i};
}
}
echo '<pre>';
print_rvar_dump($tablica);
echo '</pre>';
?></nowikisource>
 
Przy stanach spacji oraz kropki wywołujemy komendy '''continue''' oraz '''break''' z parametrem 2, aby podkreślić, że dotyczą one pętli for, a nie instrukcji switch. '''break''' w kodzie obsługi średnika nie ma parametru, więc odnosi się do instrukcji switch.