Статьи

Циклы обучения

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