Цикл - це конструкція мови, яка виконує блок коду більше одного разу.
Ми звикли, що сценарії виконуються лінійно: зверху вниз, рядок за рядком. Але що робити, якщо треба повторити якусь інструкцію кілька разів? Наприклад, як вивести на екран натуральні числа від 1 до 9?
Є очевидний спосіб:
<?php
print(1);
print(2);
print(3);
// і так далі...
Але він змушує писати багато коду. І що якщо потрібно вивести послідовність із мільйона чисел? Ще бувають ситуації, коли заздалегідь невідомо скільки разів потрібно виконати певну інструкцію.
Використання циклів значно спрощує і вкорочує код. Цикли незамінні в ситуаціях, коли заздалегідь невідомо скільки разів має виконатися блок коду. Таке число залежить від безлічі умов і обчислюється в момент виконання сценарію.
Так виглядає цикл у PHP:
<?php
while (<умова циклу>) {
<тіло циклу>
}
У минулому розділі ви познайомилися з поняттям виразу і його істинністю.
Вираз часто використовується в циклах, він поміщається на місце <умова циклу> і визначає, чи буде виконано блок коду - <тіло циклу>.
Якщо вираз з умови циклу повертає істину, то виконання відразу перейде до блоку "тіло циклу". Якщо ж він поверне неправду, то тіло циклу не буде виконано. Сценарій продовжить виконуватися, як зазвичай, з наступного рядка після циклу.
Назва "цикли" відображає суть їхньої дії - вони "зациклюють" лінійне виконання на своєму блоці коду і не дають сценарію виконуватися далі, поки умова циклу буде істинною.
👉 Послідовність виконання коду при використанні циклів:
Звичайне виконання коду, рядок за рядком, поки не зустрівся цикл.
Зустрівся цикл: виконуємо умову циклу.
Якщо умова повернула неправду: виходимо з циклу, виконуємо рядок після циклу і продовжуємо лінійне виконання.
Якщо умова повернула істину: виконуємо все тіло циклу.
Повторюємо пункт 2.
Кожна послідовність із кроків 2-4, тобто чергове виконання коду в тілі циклу - називається ітерацією.
Кількість ітерацій має бути скінченною, нескінченне виконання одного блоку коду не входить у наші плани.
А отже, необхідно заздалегідь передбачити ситуацію, коли істинна умова стане хибною.
Тепер повернемося до задачі з виведення на екран усіх натуральних чисел:
<?php
$last_num = 1;
while ($last_num < 10) {
print($last_num);
$last_num = $last_num + 1;
}
Цей цикл у своєму тілі містить дві інструкції. Перша виводить на екран цифру зі змінної. Друга інструкція збільшує значення змінної на одиницю. Скільки разів буде виконано такий цикл?
Цикли виконуються, поки їхня умова залишається істинною, а в нашій умові значення змінної має бути меншим за десять. Оскільки початкове значення змінної - одиниця, то нескладно порахувати, що цикл виконається рівно дев'ять разів. На десятий раз значення змінної $last_num стане дорівнювати десяти і умова $last_num < 10 перестане бути істинною.
Найчастіше цикли використовуються для роботи з масивами - для перерахування всіх елементів масиву і виконання якої-небудь дії з кожним із цих елементів. Уміння використовувати цикли та масиви спільно дає змогу виконувати безліч цікавих і різноманітних завдань!
Ми вже навчилися працювати з масивами. Наприклад, ми можемо показати всі значення масиву, звернувшись до кожного з елементів за його індексом. Але це утомливо: звертатися до кожного з елементів масиву по черзі, коли ми хочемо показати всі його
значення.
За допомогою циклів показують вміст будь-якого масиву, і це вимагає всього кілька рядків коду!
Перепишемо приклад із виведенням списку улюблених серіалів, задіявши цикл:
<?php
$fav_shows = [
"game of thrones",
"american horror storry",
"walking dead"
];
$cur_index = 0;
while ($cur_index < 3) {
print($fav_shows[$cur_index] . ", ");
$cur_index = $cur_index + 1;
}
У цьому прикладі цикл виводить елемент за індексом. Індекс тепер знаходиться у змінній $cur_index і початкове значення у нього нуль. Значення змінної збільшується на одиницю з кожною ітерацією циклу, поки не досягне трьох. У цей момент умова $cur_index < 3 перестане бути істинною і цикл зупиниться, перебравши весь масив.
Цикли в PHP можуть бути різних типів. Вище ми познайомилися з циклом типу while. Його головна особливість - необхідно вказувати вираз у його умові. Але while не єдиний вид циклів у PHP. Є ще як мінімум два інших.
Масиви і цикли так часто використовуються разом, що розробники мови навіть додали вид циклу спеціально для перебору масивів. Цикл називається foreach. Навіщо знадобилося придумувати цей цикл?
Річ у тім, що while занадто універсальний. А платою за цю універсальність завжди буде складніший і об'ємніший код. Доводиться придумувати умову, стежити, щоб вона не була нескінченною. А в тілі циклу обов'язково треба не забути збільшувати змінну-лічильник. І все це потрібно для простого перебору елементів масиву. Невже не можна зробити простіше?
👉 foreach вирішує всі ці проблеми. Його можливості:
не потрібно писати умову;
дозволяє отримувати ключі масиву;
сам присвоює черговий елемент масиву змінній.
Цикл foreach незаменим, когда дело доходит до итерации ассоциативными массивами. Например: у нас есть данные пользователя, которые хранятся в ассоциативном массиве. На сайте понадобилось сделать страницу с информацией об этом пользователе. Задача в том, чтобы показать на странице все данные, которые известны об этом человеке. Выглядеть это должно так:
Ім'я: Євген
Вік: 27
Рід занять: Програміст
Оригінальний масив, який треба показати в такому вигляді:
$user = [
'Ім\'я' => 'Євген',
'Вік' => '27',
'Рід занять' => 'Програміст'
];
Код сценарію, який обійде масив і покаже весь його вміст, займе всього чотири рядки:
foreach ($user as $key => $value) {
print($key . ': ');
print($value . '<br>');
}
На кожній ітерації циклу всередині його тіла будуть визначатися змінні $key і $value. У першу потраплятиме черговий ключ масиву, а в другу - чергове значення за цим ключем.