PHP/Instrukcja for
Instrukcja for[edytuj]
Pętle[edytuj]
Wszystkie kolejne struktury kontrolne, jakie poznamy, określa się jednym wspólnym terminem: pętle.
Pętlą nazywamy strukturę kontrolną powtarzającą dany kod do czasu spełnienia określonego warunku. |
Wiemy już, że pętla powtarza w kółko pewien fragment kodu. Różnice między poszczególnymi rodzajami dotyczą tego, jak i kiedy jest ona przerywana. Na początek zajmiemy się pętlą for. Pokazuje ona pazurki, kiedy zliczamy ilość wywołań pętli i na podstawie tego określamy, czy trzeba ją przerwać, czy nie. W for definiujemy trzy wyrażenia:
- Startu - najczęściej inicjuje licznik wywołań
- Końca - warunek zakończenia
- Iteracji - najczęściej zwiększa licznik wywołań
Oddzielone są one średnikami. Pokażemy to na przykładzie skryptu wyświetlającego liczby od 0 do 9.
1<?php
2for($i = 0; $i < 10; $i++)
3{
4 echo $i.'<br/>';
5}
Warunek startu tworzy nową zmienną $i
z wartością zero. Następnie określamy, że dopóki $i
jest mniejsze od 10, pętla ma się powtarzać. Przy każdym cyklu należy zwiększyć wartość $i
o 1.
Uwaga!
|
Proste wyświetlanie tablic[edytuj]
Pętla for jest użyteczna przy wyświetlaniu tablic z indeksami numerycznymi. Mamy plik tekstowy z zawartością:
Litwo, ojczyzno moja! Ty jesteś jak zdrowie, Ile cię trzeba cenić, ten tylko się dowie, Kto cię stracił, dziś piękność twą w całej ozdobie Widzę i opisuję, bo tęsknię po tobie.
Zastosujemy funkcję file()
, 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:
1<?php
2$plik = file('plik.txt');
3
4echo '<ul>';
5for($i = 0, $x = count($plik); $i < $x; $i++)
6{
7 echo '<li>'.trim($plik[$i]).'</li>';
8}
9echo '</ul>';
Do określenia ilości wierszy użyliśmy poznanej już wcześniej funkcji count()
. Przy wyświetlaniu stosujemy jeszcze jedną: trim()
. 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:
5for($i = 0; $i < count($plik); $i++)
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.
Break i Continue[edytuj]
Przy okazji omawiania instrukcji switch poznaliśmy komendę break. Ma ona bardzo duże zastosowanie przy pętlach, które potrafi przerywać. Istnieje także kolejne polecenie: continue. Przerywa ono jedynie aktualny cykl pętli i powoduje rozpoczęcie następnego.
Mamy prosty ciąg tekstowy:
Komenda; Komenda; Komenda; Komenda. To już pomijamy.
Wiemy o nim trzy rzeczy:
- Spacje ignorujemy
- Kropka oznacza koniec wprowadzania komend
- Średnik separuje komendy
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:
1<?php
2$tekst = 'Komenda; Komenda; Komenda; Komenda. To już pomijamy.';
3$tablica = array(0 => '');
4$t = 0;
$tekst
to tekst do przetworzenia. $tablica
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 strlen()
. $i
to licznik położenia w ciągu tekstowym. Wskazuje na aktualnie przetwarzany znak:
5for($i = 0; $i < strlen($tekst); $i++)
6{
Implementujemy możliwość pierwszą. Spacje ignorujemy, dlatego przy ich napotkaniu przerywamy aktualny cykl pętli komendą continue i przechodzimy do następnego:
7 if($tekst[$i] == ' ')
8 {
9 continue;
10 }
Zauważ, jak odwołujemy się do określonego znaku wewnątrz ciągu: $tekst[$i]
. Numer znaku (począwszy od zera) podajemy jako indeks w nawiasach kwadratowych, identycznie jak w tablicach.
Druga możliwość - po napotkaniu kropki przerwać pętlę wcześniej:
11 if($tekst[$i] == '.')
12 {
13 break;
14 }
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:
15 if($tekst[$i] == ';')
16 {
17 $t++;
18 $tablica[$t] = '';
19 }
20 else
21 {
22 $tablica[$t] .= $tekst[$i];
23 }
Teraz dopełnienie formalności, tj. zamknięcie pętli i wyświetlenie zawartości tablicy funkcją var_dump()
:
24}
25
26echo '<pre>';
27var_dump($tablica);
28echo '</pre>';
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):
1<?php
2$tekst = 'Komenda; Komenda; Komenda; Komenda. To już pomijamy.';
3$tablica = array(0 => '');
4$t = 0;
5
6for($i = 0; $i < strlen($tekst); $i++)
7{
8 switch($tekst[$i])
9 {
10 case ' ':
11 continue 2;
12 case '.':
13 break 2;
14 case ';':
15 $t++;
16 $tablica[$t] = '';
17 break;
18 default:
19 $tablica[$t] .= $tekst[$i];
20 }
21}
22
23echo '<pre>';
24var_dump($tablica);
25echo '</pre>';
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.