HTML Diff
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>При таком обходе проверка остановки должна быть именно на &gt;=, иначе будет пропущен элемент с индексом 0.</p>
9 <p>При таком обходе проверка остановки должна быть именно на &gt;=, иначе будет пропущен элемент с индексом 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>