Лекція № 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. Ключем даного масиву є ім'я змінної, а значенням елементу масиву — значення змінної. Про цей важливий масив ми ще не раз поговоримо в цій книзі.