Существенным преимуществом компьютеров является то, что они могут выполнять повторяющиеся задачи легко и эффективно. Вместо написания повторяющегося кода вы можете написать набор операторов, которые обрабатывают некоторые данные, а затем заставляют компьютер выполнять их многократно, используя конструкцию, известную как цикл. Циклы бывают разных типов в 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