Лекція № 7
Тема: Цикли
План
Цикли з передумовою
Цикли з постумовою
Цикл з лічильником
Оператори break і continue
Цикл перебору масивів
ЦИКЛИ
На другому місці по частоті використання, після умовного оператора, знаходяться цикли. Цикл дозволяє повторити певну (і навіть не визначене — коли робота циклу залежить від умови) кількість разів які-небудь оператори. Дані оператори називаються тілом циклу -они «крутитимуться» в циклі. Прохід циклу називається ітерацією.
Як і С, PHP підтримує три види циклів:
Цикл з передумовою (while)
Цикл з післяумовою (do-while)
Цикл з лічильником (for)
Цикл з передумовою While
Принцип роботи циклу з передумовою:
Обчислюється значення логічного виразу.
Якщо значення істинне, виконується тіло циклу, інакше — перехід до наступного за циклом оператора.
Синтаксис циклу з передумовою виглядає таким чином:
while (логічний вираз) інструкція;
В даному випадку тілом циклу є «інструкція». Звичайне тіло циклу складається з більшого числа операторів. Простий приклад циклу:
<?
$i=0; while($i++ < 10) echo $i;
?>
Дана програма виведе рядок 12345678910. Звернете увагу на послідовність виконання операцій умови $i++ < 10. Спочатку перевіряється умова, а тільки потім збільшується значення змінної. Якщо ж ми поставимо операцію інкремента перед змінній (++Si<10), то спочатку буде виконано збільшення змінної, а тільки потім — порівняння. В результаті ми отримали б рядок 123456789.
Цей же цикл можна було б записати по-іншому:
Si = 0; while ($i<10)
{
$i ++;// збільшення лічильника
echo $i;
}
Якщо ми збільшимо лічильник після виконання оператора echo, ми отримаємо рядок 0123456789. Але у будь-якому випадку, у нас буде 10 ітерацій. Ітерація — це прохід циклу, тобто виконання інструкцій тіла циклу.
Цикл з постумовою do while
Цикл з умовою поста відрізняється від циклу з передумовою тим, що спочатку виконується тіло циклу, а тільки потім вже перевіряється умова. Таким чином, тіло циклу хоч би один раз, але буде обов'язково виконано.
Синтаксис циклу do while такий:
do
{// тіло циклу
} while (умова);
Спробуємо за допомогою циклу з умовою поста отримати рядок 12345678910. Оскільки в цьому циклі спочатку виконується тіло, а потім перевіряється умова, то нам потрібно встановити початкове значення лічильника в одиницю:
<? $i = 1; do echo $i; while ($i++ <10); ?>
Нагадаю, що ми можемо збільшувати значення лічильника в тілі циклу (так навіть зрозуміліше).
Цикл з лічильником For
Цикл з лічильником використовується для виконання тіла циклу певної кількості разів.
Наприклад, в циклі while зручно чекати певної події, наприклад, коли що повертається якоюсь функцією значення буде істинне (а така ситуація може і не відбутися). Цикл for зручно використовувати, наприклад, для заповнення масиву. Синтаксис циклу for:
for (команда_инициапизации; умова; команды_после_итерации) { тіло циклу }
Оператор for починає свою роботу з виконання команд ініціалізації. Дані команди виконуються всього лише один раз. Після цього перевіряється умова: якщо воно істинне, виконується тіло циклу. Після того, як буде виконаний останній оператор тіла, виконуються команди «Після ітерації». Потім знову перевіряється умова, у випадку, якщо воно істинне, виконується тіло циклу і ітераційні для поста команди, і т.д.
Виведемо звичний нам рядок:
<? for ($i=0; $i<10; $i++) echo $i; ?>
Даний сценарій виведе рядок 0123456789. Нам же потрібний рядок 12345678910, тому потрібно забезпечити збільшення лічильника при перевірці логічного виразу:
<? for ($i=0; $i++<10;) echo $i; ?>
В цьому випадку нам не потрібні команди, що виконуються після ітерації. Якщо вам потрібно вказати декілька команд, ви можете розділяти їх комами:
for ($i=0, $j=0; $<10; $i++, $j++) echo $i;
Як ви вже встигли відмітити, цикл з лічильником є варіацією циклу з передумовою, оскільки спочатку в нім перевіряється умова, а тільки потім виконується тіло.
Альтернативний синтаксис
Цикли while і for мають альтернативний синтаксис. Для циклу while він такий:
while (логическое_выражение):
тіло циклу endwhile;
А для циклу for — такий:
for (команды_инициализации; умова; команды_после_итерации) :
тіло циклу endfor;
Зверніть увагу на двокрапку — його наявність обов'язкова! Альтернативний синтаксис також передбачений для оператора if-eIse:
if (логическое_выражение):
команди; е1зе1^логическое_выражение2) :
команди; else:
команди; endif;
Використовувати даний синтаксис чи ні — ваша особиста справа. Що ж до мене, то я вважаю за краще використовувати «класику» — звичайний синтаксис.
Використовувати альтернативний синтаксис має сенс, якщо ви вважаєте за краще включати в РНР-сценарії HTML-код, а не виводити його за допомогою echo. B цьому випадку альтернативний синтаксис полегшує використання операторів if-else, while і for:
<?if ($REMOTE_ADDR):?>
<hl>Welcome home!</hl> <?else:?>
<hl>Hello</hl> <?endif; ?>
Оператори break і continue
При використанні циклом можна використовувати операторів break і continue. Перший перериває роботу всього циклу, а другою — тільки поточній ітерації. Розглянемо наступні приклади:
<?
$i = 0;
while ($i++ < 10)
{
if ($i==3) break;
echo "Ітерація $i\n";
?>
В даному прикладі після другої ітерації робота циклу буде перервана і програма виведе рядки:
Ітерація 1 Ітерація 2
Якщо ж замість оператора break використовувати оператора continue, буде перервана робота тільки третьої ітерації і ми отримаємо висновок:
Ітерація 1
Ітерація 2
Ітерація 4
Ітерація 5
Ітерація 6
Ітерація 7
Ітерація 8
Ітерація 9
Ітерація 10
Припустимо, що у нас є вкладені цикли, наприклад
for (...) {
for (...)
{
for (...)
Нам потрібно перервати роботу певного циклу, наприклад, першого. Тоді як оператор break знаходиться в тілі третього. В цьому випадку мож-
але передати функції break параметр — номер циклу, наприклад, break(l). Нумерація циклів починається з одиниці.
Цикл перебору масивів foreach
У четвертій версії PHP з'явився ще один вид циклу — foreach. Даний цикл призначений спеціально для перебору масивів.
Синтаксис даного Циклу такий:
foreach(MACCMB as $ключ=>$значение) оператори;
Оператори, що містяться в тілі циклу, будуть виконані для кожного елементу масиву. Змінна $ключ міститиме ім'я ключа елементу, а змінна $значение — значення елементу.
Наступний приклад відобразить значення масиву SGLOBALS, що містить глобальні змінні (будуть виведені як імена змінних, так і їх значення):
<?
foreach($GLOBALS as $key=>$value) echo "$key = $value\n";
?>
У PHP є один дуже корисний стандартний масив $GLOBALS. Ключем даного масиву є ім'я змінної, а значенням елементу масиву — значення змінної. Про цей важливий масив ми ще не раз поговоримо в цій книзі.