0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Работа с массивами практически всегда подразумевает итерацию по его элементам. Самый простой способ выполнить ее - это циклы, которые мы изучим в этом уроке.</p>
1
<p>Работа с массивами практически всегда подразумевает итерацию по его элементам. Самый простой способ выполнить ее - это циклы, которые мы изучим в этом уроке.</p>
2
<h2>Как обходить массив</h2>
2
<h2>Как обходить массив</h2>
3
<p>Для начала рассмотрим код:</p>
3
<p>Для начала рассмотрим код:</p>
4
<p>В этом коде создается массив из трех элементов - имен. Далее в цикле происходит обход массива и вывод на экран всех имен. При этом каждое имя оказывается на новой строке.</p>
4
<p>В этом коде создается массив из трех элементов - имен. Далее в цикле происходит обход массива и вывод на экран всех имен. При этом каждое имя оказывается на новой строке.</p>
5
<p>Рассмотрим этот этап подробнее. Когда мы обходим массив циклом for, счетчик играет роль индекса в массиве. Он инициализируется нулем и увеличивается до count($userNames) - 1, что соответствует индексу последнего элемента.</p>
5
<p>Рассмотрим этот этап подробнее. Когда мы обходим массив циклом for, счетчик играет роль индекса в массиве. Он инициализируется нулем и увеличивается до count($userNames) - 1, что соответствует индексу последнего элемента.</p>
6
<p>Интересно производится печать на экран. Элемент массива может участвовать в строковой интерполяции, поэтому мы можем сразу печатать и имя и перевод строки, используя конструкцию "{$userNames[$i]}\n".</p>
6
<p>Интересно производится печать на экран. Элемент массива может участвовать в строковой интерполяции, поэтому мы можем сразу печатать и имя и перевод строки, используя конструкцию "{$userNames[$i]}\n".</p>
7
<p>А что, если нам нужно вывести значения в обратном порядке? Для этого есть два способа. Первый способ - идти в прямом порядке от нулевого индекса до последнего и каждый раз вычислять нужный индекс по такой формуле:</p>
7
<p>А что, если нам нужно вывести значения в обратном порядке? Для этого есть два способа. Первый способ - идти в прямом порядке от нулевого индекса до последнего и каждый раз вычислять нужный индекс по такой формуле:</p>
8
<p>Но есть и другой способ. Можно просто идти от верхней границы к нижней. В такой ситуации код меняется на следующий:</p>
8
<p>Но есть и другой способ. Можно просто идти от верхней границы к нижней. В такой ситуации код меняется на следующий:</p>
9
<p>При таком обходе проверка остановки должна быть именно на >=, иначе будет пропущен элемент с индексом 0.</p>
9
<p>При таком обходе проверка остановки должна быть именно на >=, иначе будет пропущен элемент с индексом 0.</p>
10
<h2>Изменение</h2>
10
<h2>Изменение</h2>
11
<p>Сам цикл при изменении остается тем же самым, меняется только его тело. Предположим, что мы хотим нормализовать список электронных адресов. Допустим, в нормализацию адресов входит приведение их к нижнему регистру. Тогда код будет выглядеть так:</p>
11
<p>Сам цикл при изменении остается тем же самым, меняется только его тело. Предположим, что мы хотим нормализовать список электронных адресов. Допустим, в нормализацию адресов входит приведение их к нижнему регистру. Тогда код будет выглядеть так:</p>
12
<p>Здесь ключевая строчка - это $emails[$i] = strtolower($emails[$i]);. В ней происходит перезапись элемента под индексом $i. Иногда полезно создать промежуточную переменную. Это упрощает анализ кода:</p>
12
<p>Здесь ключевая строчка - это $emails[$i] = strtolower($emails[$i]);. В ней происходит перезапись элемента под индексом $i. Иногда полезно создать промежуточную переменную. Это упрощает анализ кода:</p>
13
<h2>Инициализация цикла</h2>
13
<h2>Инициализация цикла</h2>
14
<p>При инициализации цикла for в круглых скобках располагаются три блока выражений, разделяемые символом ;.</p>
14
<p>При инициализации цикла for в круглых скобках располагаются три блока выражений, разделяемые символом ;.</p>
15
<p>Содержимое первого блока инициализации выполняется перед началом цикла и только один раз.</p>
15
<p>Содержимое первого блока инициализации выполняется перед началом цикла и только один раз.</p>
16
<p>Второй блок определяет условие выполнения цикла и содержит выражение, которое вычисляется перед каждой очередной итерацией. Работа цикла продолжается, если это выражение возвращает true. Если же проверка оказывается ложной, цикл заканчивает свою работу.</p>
16
<p>Второй блок определяет условие выполнения цикла и содержит выражение, которое вычисляется перед каждой очередной итерацией. Работа цикла продолжается, если это выражение возвращает true. Если же проверка оказывается ложной, цикл заканчивает свою работу.</p>
17
<p>В третьем блоке содержатся выражения, которые обрабатываются в конце итерации цикла. Обычно здесь происходит необходимое преобразование счетчика - например, инкремент:</p>
17
<p>В третьем блоке содержатся выражения, которые обрабатываются в конце итерации цикла. Обычно здесь происходит необходимое преобразование счетчика - например, инкремент:</p>
18
<p>В процессе работы цикла мы заново вычисляем выражение, которое содержится в блоке условий. Это значит, что в нашем примере длина массива count($colors) будет вычисляться вновь и вновь при каждом проходе цикла. Сам массив остается неизменным, поэтому повторное вычисление размера оказывается избыточным. Повторения операции можно избежать, если определить переменную за пределами цикла и присвоить ей необходимое значение:</p>
18
<p>В процессе работы цикла мы заново вычисляем выражение, которое содержится в блоке условий. Это значит, что в нашем примере длина массива count($colors) будет вычисляться вновь и вновь при каждом проходе цикла. Сам массив остается неизменным, поэтому повторное вычисление размера оказывается избыточным. Повторения операции можно избежать, если определить переменную за пределами цикла и присвоить ей необходимое значение:</p>
19
<p>Но существует более оптимальное решение: описать несколько выражений в блоке инициализации цикла for и разделить их запятыми. Это позволяет избегать лишних вычислений. В нашем примере мы можем единожды определить значение length. Также мы сразу увидим переменные, которые используются только внутри цикла:</p>
19
<p>Но существует более оптимальное решение: описать несколько выражений в блоке инициализации цикла for и разделить их запятыми. Это позволяет избегать лишних вычислений. В нашем примере мы можем единожды определить значение length. Также мы сразу увидим переменные, которые используются только внутри цикла:</p>
20
<p>Еще рассмотрим пример использования нескольких выражений в блоке изменения счетчика:</p>
20
<p>Еще рассмотрим пример использования нескольких выражений в блоке изменения счетчика:</p>
21
<p>Рассмотренные блоки могут быть пустыми, при этом в них сохранятся разделители ;. Это допустимо, но так лучше не делать: в идеале все блоки должны быть полными и содержать понятное описание работы цикла.</p>
21
<p>Рассмотренные блоки могут быть пустыми, при этом в них сохранятся разделители ;. Это допустимо, но так лучше не делать: в идеале все блоки должны быть полными и содержать понятное описание работы цикла.</p>