Существенным преимуществом компьютеров является то, что они могут выполнять повторяющиеся задачи легко и эффективно. Вместо написания повторяющегося кода вы можете написать набор операторов, которые обрабатывают некоторые данные, а затем заставляют компьютер выполнять их многократно, используя конструкцию, известную как цикл. Циклы бывают разных типов в PHP: for
, while
, do-while
и foreach
. Я познакомлю вас с каждым из них и покажу, как они могут сделать повторяющиеся задачи простыми и легкими в обслуживании.
Цикл for
Давайте рассмотрим пример генерации таблицы умножения для числа 12. Вы можете вычислить и отобразить значения, полученные в результате умножения 12 на 1, 2, 3 и т. Д., Примерно так:
<?php echo "1 × 12 = " . (1 * 12) . "<br>"; echo "2 × 12 = " . (2 * 12) . "<br>"; echo "3 × 12 = " . (3 * 12) . "<br>"; ...
… и так далее. Возможно, расширение кода до 12 × 12 будет быстрым, просто скопируйте, вставьте и исправьте. Но что, если расчет должен был пойти до 50 × 12? Подход копирования и вставки действительно неэффективно использует ваше время и может привести к громоздкому коду в будущем.
Но никогда не бойся! Решение под рукой — for
цикла.
<?php for ($i = 1; $i <= 12; $i++) { echo $i . " × 12 = " . ($i * 12) . "<br>"; }
Этот пример показывает, сколько строк необходимо для создания таблицы умножения для любого произвольного значения.
В цикле for используются три отдельных выражения, которые разделяются точкой с запятой и заключаются в круглые скобки:
- Первое выражение
$i = 1
инициализирует переменную$i
для использования в качестве счетчика ($i
— это обычно используемое имя переменной для счетчиков цикла). Счетчик будет использоваться для отслеживания того, сколько раз цикл был выполнен. - Второе выражение
$i <= 12
определяет, остановить ли цикл или продолжить. В этом случае цикл будет выполнен 12 раз. Чтобы быть более точным, цикл будет продолжаться, пока$i
имеет значение, меньшее или равное 12. Как только$i
имеет более высокое значение, цикл останавливается. - Третье выражение
$i++
обновляет счетчик.$i
увеличивается на 1 каждый раз после цикла, когда цикл завершен. Цикл цикла также известен как итерация.
С точки зрения обслуживания, если вам нужно изменить код, чтобы расширить диапазон до 50 × 12, то нужно изменить только значение во втором выражении:
<?php for ($i = 1; $i <= 50; $i++) { echo $i . " × 12 = " . ($i * 12) . "<br>"; }
Это явно лучше, чем добавить еще 38 строк кода!
А что если вы хотите обработать в обратном порядке, то есть умножить 12 на 12, затем 11, затем 10 и так далее? Это просто, если вы просто отрегулируете три выражения.
<?php for ($i = 12; $i > 0; $i--) { echo $i . " × 12 = " . ($i * 12) . "<br>"; }
$i
инициализируется до 12, значение, с которого должен начинаться цикл. $i > 0
гарантирует, что цикл будет повторяться, пока $i
равно 1 или больше. После каждого цикла значение $i
уменьшается на единицу.
Циклы while
и do-while
Цикл for
подходит, когда нужно выполнить конечное число действий. Однако могут быть случаи, когда вам необходимо выполнять повторяющиеся действия для неопределенного числа итераций. В этом случае идеально подходят циклы while или do-while
.
Этот пример иллюстрирует цикл do-while
while, который читает файл и печатает его содержимое — вы не знаете заранее, сколько строк данных содержится в этом файле, поэтому использование for явно не подходит.
<?php $file = "employees.csv"; $employeeFile = fopen($file, "r"); do { $data = fgets($employeeFile); echo $data . "<br>"; } while (!feof($employeeFile));
Обратите внимание, что ключевое слово do
предшествует открывающей скобке, а предложение while
следует за закрывающей скобкой. Цикл будет продолжаться до достижения конца файла, независимо от того, есть ли 5 или 500 строк.
Тот же пример цикла while выглядит только так:
<?php $file = "employees.csv"; $employeeFile = fopen($file, "r"); while (!feof($employeeFile)) { $data = fgets($employeeFile); echo $data . "<br>"; }
Так чем же это отличается от do-while
? Есть тонкое, но важное отличие — do-while
будет выполнено хотя бы один раз, потому что условие конца файла проверяется только после первой итерации. Цикл while начинает выполнение, только если мы не находимся в конце файла.
Петля foreach
Вы видели простой пример печати таблицы умножения для числа 12. Давайте теперь рассмотрим другой пример, на этот раз с использованием массива. Как указывается в статье «Введение в массивы PHP», массивы — это, по сути, индексированные таблицы данных. Рассмотрим этот массив, содержащий месяцы года:
== img1 ==
Чтобы получить доступ к значению, вам нужен связанный ключ. Чтобы проиллюстрировать, как вы можете использовать $i
в качестве ключа и счетчика, давайте напечатаем календарные месяцы из массива с именем $months
:
<?php $months = array("January", "February", "March", ... "Dec"); for ($i = 0; $i < 12; $i++) { echo $months[$i] . "<br>"; }
Вы используете цикл for
как и раньше, но с двумя тонкими отличиями — во-первых, $i
инициализируется в 0, потому что первый элемент в автоматически индексируемом массиве равен 0. Во-вторых, условие проверяет, что счетчик меньше 12, потому что цикл должен быть остановлен после обработки 12 элементов (значения ключей от 0 до 11 в массиве).
Вы, возможно, догадались, что есть альтернатива использованию для. Да, эта альтернатива — foreach
. Вам не требуется заранее знать, сколько элементов массива существует, или отслеживать переменную счетчика.
Есть два варианта цикла foreach
и я покажу вам оба. Первый получает только значение каждого элемента массива.
<?php foreach ($months as $value) { echo $value . "<br>"; }
Вы можете увидеть, как это более простое решение для перебора массива, чем использование for
. В скобках указывается имя массива, за которым следует ключевое слово as
и переменная, которой будет присвоено значение текущего элемента. В этом случае $months
— это массив, а $value
— это переменная значения. Нет необходимости в счетчиках или проверке того, должен ли цикл продолжаться, и, если размер массива изменяется, нет необходимости изменять какой-либо код.
В другом варианте foreach
вас есть доступ к ключу, а также к значению:
<?php foreach ($months as $key => $mon) { echo $key . " - " . $mon . "<br>"; }
Здесь $key =>
было добавлено к выражению, которое позволяет вам получить доступ к значению ключа.
break
и continue
Ключевые слова
В этой статье я предполагал, что вы хотите обработать цикл от начала до конца. Конечно, возможно, что вы захотите выйти из цикла раньше, если произойдет определенное условие. Для этого вы можете использовать ключевое слово break
, как показано в следующем модифицированном примере предыдущего цикла do-while
while:
<?php $file = "employee.sql"; $employeeFile = fopen($file, "r"); do { $data = fgets($employeeFile); if (strlen($data) == 0) { break; } else { echo $data; } } while (!feof($employeeFile));
Каждая строка файла извлекается и проверяется — если строка пуста, break
используется для немедленного выхода из цикла. Предложение while
сохраняет цикл работающим, пока он еще не достиг конца файла.
Если вы не хотите выходить из цикла, а вместо этого continue
к следующей итерации, используйте вместо этого ключевое слово continue
.
Резюме
В этой статье вы увидели, что существует множество способов использования циклов для повторяющихся задач и облегчения поддержки вашего кода. Я хотел бы оставить вам несколько советов по использованию циклов:
- Используйте, когда у вас есть конечное и известное количество итераций.
- Используйте
while
илиdo-while
когда число итераций неизвестно, но может контролироваться условием (например, достижение конца файла). - Используйте
foreach
когда вам нужно обработать каждый элемент в массиве. - Если вам нужно полностью выйти из цикла, вы можете использовать
break
. - Если вы хотите пропустить оставшиеся операторы для итерации и продолжить со следующей, вы можете использовать
continue
.
Изображение с помощью Marcio Jose Bastos Silva / Shutterstock