Цикл For — PHP

Операторы циклов в Java: for, while и do … while. Вложенные циклы.

for

(PHP 4, PHP 5, PHP 7, PHP 8)

Цикл for самый сложный цикл в PHP.Он ведёт себя так же, как и в языке C. Синтаксис цикла for следующий:

for (expr1; expr2; expr3) statement

Первое выражение (expr1) всегда вычисляется (выполняется) только один раз в начале цикла.

В начале каждой итерации оценивается выражение expr2. Если оно принимает значение true, то цикл продолжается и выполняются вложенные операторы. Если оно принимает значение false, выполнение цикла заканчивается.

В конце каждой итерации выражение expr3 вычисляется (выполняется).

Каждое из выражений может быть пустым или содержать несколько выражений, разделённых запятыми. В expr2 все выражения, разделённые запятыми, вычисляются, но результат берётся из последнего. Если выражение expr2 отсутствует, это означает, что цикл будет выполняться бесконечно. (PHP неявно воспринимает это значение как true, так же, как в языке C). Это может быть не так бесполезно, как вы могли подумать, так как часто необходимо прервать цикл, используя условный оператор break вместо использования выражения в цикле for, которое принимает истинное значение.

Рассмотрим следующие примеры. Все они отображают числа от 1 до 10:

<?php
/* пример 1 */for ($i 1$i <= 10$i++) {
    echo 
$i;
}
/* пример 2 */for ($i 1; ; $i++) {
    if (
$i 10) {
        break;
    }
    echo 
$i;
}
/* пример 3 */$i 1;
for (; ; ) {
    if (
$i 10) {
        break;
    }
    echo 
$i;
    
$i++;
}
/* пример 4 */for ($i 1$j 0$i <= 10$j += $i, print $i$i++);
?>

Конечно, первый пример кажется самым хорошим (или, возможно, четвёртый), но вы можете обнаружить, что возможность использовать пустые выражения в циклах for может стать удобной во многих случаях.

PHP также поддерживает альтернативный синтаксис с двоеточием для циклов for.

for (expr1; expr2; expr3): statement …endfor;

Перебор массивов как показано ниже — это обычное дело для многих пользователей.

<?php
/*
 * Это массив с некоторыми данными, которые мы хотим изменить
 * при работе цикла.
 */
$people = array(
    array(
‘name’ => ‘Kalle’‘salt’ => 856412),
    array(
‘name’ => ‘Pierre’‘salt’ => 215863)
);

for(

$i 0$i count($people); ++$i) {
    
$people[$i][‘salt’] = mt_rand(000000999999);
}
?>

Вышеприведённый код может работать медленно, так как размер массива вычисляется в каждой итерации. Поскольку размер не меняется, цикл может быть легко оптимизирован с помощью промежуточной переменной, в которую будет записан размер массива, вместо повторяющихся вызовов функции count():

<?php
$people 
= array(
    array(
‘name’ => ‘Kalle’‘salt’ => 856412),
    array(
‘name’ => ‘Pierre’‘salt’ => 215863)
);

for(

$i 0$size count($people); $i $size; ++$i) {
    
$people[$i][‘salt’] = mt_rand(000000999999);
}
?>

matthiaz

9 years ago

Looping through letters is possible. I’m amazed at how few people know that.

for($col = ‘R’; $col != ‘AD’; $col++) {

    echo $col.’ ‘;
}

returns: R S T U V W X Y Z AA AB AC

Take note that you can’t use $col < ‘AD’. It only works with !=

Very convenient when working with excel columns.

nzamani at cyberworldz dot de

20 years ago

The point about the speed in loops is, that the middle and the last expression are executed EVERY time it loops.
So you should try to take everything that doesn’t change out of the loop.
Often you use a function to check the maximum of times it should loop. Like here:

<?php
for ($i = 0; $i <= somewhat_calcMax(); $i++) {
 
somewhat_doSomethingWith($i);
}
?>

Faster would be:

<?php
$maxI
= somewhat_calcMax();
for (
$i = 0; $i <= $maxI; $i++) {
 
somewhat_doSomethingWith($i);
}
?>

And here a little trick:

<?php
$maxI
= somewhat_calcMax();
for (
$i = 0; $i <= $maxI; somewhat_doSomethingWith($i++)) ;
?>

The $i gets changed after the copy for the function (post-increment).

Andrew

7 years ago

You can use strtotime with for loops to loop through dates

<?php
for ($date = strtotime(«2014-01-01»); $date < strtotime(«2014-02-01»); $date = strtotime(«+1 day», $date)) {
    echo
date(«Y-m-d», $date).«<br />»;
}
?>

Warbo

7 years ago

Remember that for-loops don’t always need to go ‘forwards’. For example, let’s say I have the following code:

<?php
for ($i = 0; $i < calculateLoopLength(); $i++) {
 
doSomethingWith($i);
}
>?

As

other comments have pointed out, if «calculateLoopLength» will keep giving back the same value, it can be moved outside the loop:

<?

php
$loopLength
= calculateLoopLength();
for (
$i=0; $i < $loopLength; $i++) {
 
doSomethingWith($i);
}
?>

However, if the order the looping doesn’t matter (ie. each iteration is independent) then we don’t need to use an extra variable either, we can just count down (ie. loop ‘backwards’) instead:

<?php
for ($i=calculateLoopLength(); $i > 0; $i—) {
 
doSomething($i);
}
?>

In fact, we can simplify this even more, since «$i > 0» is equivalent to «$i» (due to type casting):

<?php
for ($i=calculateLoopLength(); $i; $i—) {
 
doSomething($i);
}
?>
Finally, we can switch to a ‘pre-decrement’ instead of a ‘post-decrement’ to be slightly more efficient (see, for example, http://dfox.me/2011/04/php-most-common-mistakes-part-2-using-post-increment-instead-of-pre-increment/ ):

<?php
for ($i = calculateLoopLength(); $i; —$i) {
 
doSomething($i);
}
?>
In this case we could also replace the entire loop with a map, which might make your algorithm clearer (although this won’t work if calculateLoopLength() == 0):

<?php
array_map
(‘doSomething’,
         
range(0, calculateLoopLength() — 1));
?>

ju dot nk at email dot cz

3 years ago

Please note that following code is working:

for ($i=$reverse?($N-1):0; $reverse?($i>-1):($i<$N); $reverse?$i—:$i++) {

… your code here

}

(Using PHP 5.4.45)

dx at e-mogensen dot dk

4 years ago

Warning about using the function «strlen» i a for-loop:

This note should might be under the «strlen» manual page, but there is a better chance for more paying attention here (nevertheless I have made a short note over there allso).

A loop function that test for the string length at each iteration takes forever (possibly due to «strlen» searches for the C-style string terminator — a binary 0 — every time..

So loops like this, using  «strlen» in the for…

for  ($i = 0;  $i < strlen($crc); $i++) …..

Will benefit tremendously in speed by a short step that saves the string length once and use that in the loop.

$clen = strlen($crc);

for  ($i = 0;  $i < $clen ; $i++) …..

Note: as a real hard-core programmer You are aware, that this is only valid if you don’t change the string content inside the loop (and hereby allso the length). If the change is only occationly , You could just refresh the length variable or else just live with a quite slow loop.

This «discovery» was made from using an example of 16 bit crc calculation over at the «crc32» function manual page, that do exactly that..

Vincenzo Raco

7 years ago

In this code:

<?php

    $array

= array(
       
‘pop0’,
       
‘pop1’,
       
‘pop2’,
       
‘pop3’,
       
‘pop4’,
       
‘pop5’,
       
‘pop6’,
       
‘pop7’,
       
‘pop8’
   
);
    echo
«Tot Before: «.count($array).«<br><br>»;
    for (
$i=0; $i<count($array); $i++) {
        if (
$i === 3) {
            unset(
$array[$i]);
        }
        echo
«Count: «.count($array). » — Position: «.$i.«<br>»;
    }
    echo
«<br> Tot After: «.count($array).«<br>»;?>

The result is:

Tot Before: 9

Count: 9 — Position: 0

Count: 9 — Position: 1
Count: 9 — Position: 2
Count: 8 — Position: 3
Count: 8 — Position: 4
Count: 8 — Position: 5
Count: 8 — Position: 6
Count: 8 — Position: 7

Tot After: 8

The position 8 is skipped, because the «expr2» {{ $i<count($array) }} is evaluated again, for each cycle.

The solution is:

<?php
   
    $array
= array(
       
‘pop0’,
       
‘pop1’,
       
‘pop2’,
       
‘pop3’,
       
‘pop4’,
       
‘pop5’,
       
‘pop6’,
       
‘pop7’,
       
‘pop8’
   
);
    echo
«Tot Before: «.count($array).«<br><br>»;
   
$count = count($array);
    for (
$i=0; $i<$count; $i++) {
        if (
$i === 3) {
            unset(
$array[$i]);
        }
        echo
«Count: «.count($array). » — Position: «.$i.«<br>»;
    }
    echo
«<br> Tot After: «.count($array).«<br>»;
   
?>

Anonymous

1 year ago

If you want to do a for and increment with decimal numbers:
<?php
for($i=0; $i<=2; $i+=0.1)
     echo
$i;
?>
The code will never show 2 as expected, because of decimal imprecision if I remember well.
You will need to round:
<?php
for($i=0; round($i,1)<=2; $i+=0.1)
    echo
$i.«,»;
?>
This code correctly shows 0,0.1 …. 2.

AoKMiKeY

6 years ago

As a note for people just starting out and wanting to know if you can do some thing like this…

<?php For( $a = 0; $a < 10; $a++ ) { ?>

//Random html elements you would like to duplicate.

<?php } ?>
Then yes you can. It works like a charm.

Philipp Trommler

8 years ago

Note, that, because the first line is executed everytime, it is not only slow to put a function there, it can also lead to problems like:

<?php

$array

= array(0 => «a», 1 => «b», 2 => «c», 3 => «d»);

for(

$i = 0; $i < count($array); $i++){

echo

$array[$i];

unset(

$array[$i]);

}

?>

This will only output the half of the elements, because the array is becoming shorter everytime the for-expression counts it.

user at host dot com

17 years ago

Also acceptable:

<?php
 
for($letter = ord(‘a’); $letter <= ord(‘z’); $letter++)
   print
chr($letter);
?>

JustinB at harvest dot org

15 years ago

For those who are having issues with needing to evaluate multiple items in expression two, please note that it cannot be chained like expressions one and three can.  Although many have stated this fact, most have not stated that there is still a way to do this:

<?php
for($i = 0, $x = $nums[‘x_val’], $n = 15; ($i < 23 && $number != 24); $i++, $x + 5;) {
   
}
?>

lishevita at yahoo dot co (notcom) .uk

14 years ago

On the combination problem again…

It seems to me like it would make more sense to go through systematically. That would take nested for loops, where each number was put through all of it’s potentials sequentially.

The following would give you all of the potential combinations of a four-digit decimal combination, printed in a comma delimited format:

<?php
for($a=0;$a<10;$a++){
    for(
$b=0;$b<10;$b++){
          for(
$c=0;$c<10;$c++){
              for(
$d=0;$d<10;$d++){
                echo
$a.$b.$c.$d.«, «;
              }
           }
      }
}
?>

Of course, if you know that the numbers you had used were in a smaller subset, you could just plunk your possible numbers into arrays $a, $b, $c, and $d and then do nested foreach loops as above.

— Elizabeth

ju dot nk at email dot cz

3 years ago

Please note that following code is working:

$reverse = TRUE;  //iteration direction switch

for ($i=$reverse?($N-1):0; $reverse?($i>-1):($i<$N); $reverse?$i—:$i++) {

… your code here

}

(Using PHP 5.4.45)

mparsa1372 at gmail dot com

3 months ago

This example counts to 100 by tens:

<?php
for ($x = 0; $x <= 100; $x+=10) {
  echo
«The number is: $x <br>»;
}
?>

htroyo

5 years ago

when iterating a multidimentional array like this:
for ($i = 0; $i < $size_x; $i++) {
    for ($j = 0; $j < $size_y; $j++) {
        do_something($a[$i][$j]);
    }
}
it is faster to use $a[$i][$j] than using $a[$j][$i]
for ($i = 0; $i < $size_x; $i++) {
    for ($j = 0; $j < $size_y; $j++) {
        do_something($a[$j][$i]);
    }
}
if you know about how RAM works you understand why

epicxmoe at gmail dot com

3 years ago

Adding Letters from A to Z inside an array.

You should test it out.

<!DOCTYPE html>

<html>
<body>
<?php
$letter
= array();
for (
$letters = ‘A’; $letters != ‘AA’; $letters++)
{
   
array_push($letter, $letters);
}
echo
‘<pre>’ . var_export($letter, true) . ‘</pre>’;
?>
</body>
</html>

bishop

17 years ago

If you’re already using the fastest algorithms you can find (on the order of O(1), O(n), or O(n log n)), and you’re still worried about loop speed, unroll your loops using e.g., Duff’s Device:

<?php
$n
= $ITERATIONS % 8;
while (
$n—) $val++;
$n = (int)($ITERATIONS / 8);
while (
$n—) {
   
$val++;
   
$val++;
   
$val++;
   
$val++;
   
$val++;
   
$val++;
   
$val++;
   
$val++;
}
?>

(This is a modified form of Duff’s original device, because PHP doesn’t understand the original’s egregious syntax.)

That’s algorithmically equivalent to the common form:

<?php
for ($i = 0; $i < $ITERATIONS; $i++) {
   
$val++;
}
?>

$val++ can be whatever operation you need to perform ITERATIONS number of times.

On my box, with no users, average run time across 100 samples with ITERATIONS = 10000000 (10 million) is:
Duff version:       7.9857 s
Obvious version: 27.608 s

kanirockz at gmail dot com

11 years ago

Here is another simple example for » for loops»

<?php

$text

=«Welcome to PHP»;
$searchchar=«e»;
$count=«0»; for($i=«0»; $i<strlen($text); $i=$i+1){
   
    if(
substr($text,$i,1)==$searchchar){
   
      
$count=$count+1;
    }

}

echo

$count

?>

this will be count how many «e» characters in that text (Welcome to PHP)

Anonymous

6 years ago

You can also work with arrays. For example, say you want to generate an array of 12 unique 2-letter strings:

<?phpfor ($names = array(); count($names) < 12; $names = array_unique($names)) {
   
$names[] = $faker->word(2);
}
print_r($names);
?>
will print something like:

Array

(
    [0] => cc
    [1] => cb
    [2] => dd
    [3] => db
    [4] => bb
    [6] => cd
    [8] => aa
    [9] => ad
    [10] => ca
    [11] => ac
    [12] => dc
    [15] => ab
)

epicxmoe at gmail dot com

3 years ago

I’ve tried to search for a results on internet for a basic array which contain letters A to Z inside

<!DOCTYPE html>

<html>
<body>
<?php
$letter
= array();
for (
$letters = ‘A’; $letters != ‘AA’; $letters++)
{
   
array_push($letter, $letters);
}
echo
‘<pre>’ . var_export($letter, true) . ‘</pre>’;
?>
</body>
</html>

Цикл for

Синтаксис цикла for выглядит следующим образом:

синтаксис цикла for в PHP

Данный цикл состоит из ключевого слова for, за которым следуют круглые скобки, содержащие внутри три выражения, разделенных точками с запятой. Он имеет следующий порядок выполнения:

  1. В начале цикла выполняется инициализирующее выражение, оно всегда вычисляется (выполняется) только один раз в самом начале.
  2. Далее следует условное выражение. Перед началом каждой итерации вычисляется значение условного выражения (условие выполнения), если оно принимает значение TRUE, то тело цикла выполняется, если оно принимает значение FALSE, выполнение цикла завершается. Если при первой проверке условие оказывается ложным, тело цикла не выполнится ни разу.
  3. В самом конце, после выполнения действий в теле цикла обрабатывается последнее выражение (следующее выражение после условия). В данном случае это инкрементирующее выражение — оно увеличивает с помощью инкремента значение переменной-счетчика.

Простой пример цикла for:

<?php for ($k = 1; $k <= 10; $k++) { echo «$k «; } ?>

На самом деле цикл for является почти универсальным, поскольку он допускает самые разные варианты своего применения.

PHP-МАСТЕР.
От теории до собственной CMS интернет-магазина
 

php.jpg

Подробнее

Бесплатный курс по PHP программированию


Подробнее

Задание

Реализуйте функцию sumOfSeries(), которая считает сумму ряда целых чисел. Ряд задаётся двумя числами — начальным и конечным.

Функция принимает два аргумента-числа и возвращает сумму ряда. Например, для аргументов 4 и 7 сумма будет 4 + 5 + 6 + 7 = 22.

<?phpsumOfSeries(1, 2); // 3sumOfSeries(1, 3); // 6sumOfSeries(4, 7); // 22

Если начальное и конечное числа равны, то результатом будет то же число:

<?phpsumOfSeries(1, 1); // 1

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются

https://github.com/hexlet-basics

Разница между DURING и FOR

Предлог during используется в ситуациях, когда одно действие произошло во время какого-то другого события. Он так и переводится на русский язык – «в течение, во время». После during мы ставим существительное, которое обозначает какое-то событие, какой-то специфический промежуток времени. Давайте рассмотрим на примерах:

I ate two buckets of popcorn during the movie session.
Я съел два ведерка попкорна за время сеанса кино.

During the winter I always gain a couple of extra pounds.
В течение зимы я всегда набираю пару лишних килограммов.

Предлог for также значит «в течение» чего-либо. Но с помощью него мы делаем акцент на том, как долго длилось действие. После for обычно указывается промежуток времени, который можно измерить (минуты, часы, дни, недели, сезоны, года и т.п.). Сравните с примерами:

My sister has been learning to play drums for three years.
Моя сестра учится играть на барабанах в течение трех лет.

Alice will be in the mountains for a month.
Элис будет в горах в течение месяца.

предлог for указывает на то, как долго длилось действие

Главное для предлога for – сколько по времени длилось действие

Разница между during и for заключается в том, что, когда мы используем during, нам важно только то, когда именно произошло событие. Мы говорим, что во время какого-то события случилось еще какое-то действие, и это действие необязательно занимало весь этот период.

Но когда мы используем for, нам важно то, как долго длилось действие. С предлогом for мы имеем в виду, что действие длилось весь указанный промежуток времени. Давайте с помощью схожих примеров разберемся, в чем конкретно выражается разница между ними.

They went to Moscow during the summer.
Они ездили в Москву в течение лета. (Имеется ввиду один раз за все лето.)

They went to Moscow for the summer.
Они ездили в Москву на лето. (Все лето провели в Москве.)

Python для цикла

Цикл for используется для повторения определенных строк кода в программе. Предположим, вы хотите напечатать числа до 10, вы можете сделать это, набрав 10 операторов печати или используя цикл for. Цикл for повторяет часть программы на основе последовательности.

цикл for повторяет тело цикла для каждого элемента в заданной последовательности. Как только все элементы выполнены, цикл завершается, и управление выходит из своего блока.

Синтаксис

for Counter in Variable:

statement 1

statement 2

statement n

zen.yandex.ru

Источник изображения

пример

a={1,2,3,4,5}

for i in a:

print i

Выход

zen.yandex.ru

Здесь переменная «а» определена с 5 значениями. Цикл for здесь не проверяет никаких условий, как в случае цикла while. Он просто следует за последовательностью переменной. Мы также объявили переменную счетчика «i», которая выполняет итерацию по всему циклу. ‘in’ — это ключевое слово, используемое для указания интерпретатора для циклического перебора переменной ‘a’. Двоеточие необходимо, чтобы сообщить интерпретатору Python, что блок цикла for начинается со следующей строки.

Примечание. Отступы необходимы, поскольку они помогают интерпретатору идентифицировать тело цикла for.

Инструкция continue

Существует также инструкция continue, при достижении которой цикл начинает новую итерацию. Иногда может быть полезна для упрощения кода, хотя практически всегда задачу можно решить и без нее.

Вложенные циклы

Так же как и условные операторы, циклы могут быть вложенными. Простой пример с одним уровнем вложенности:

<?php for ($i = 0; $i < 4; $i++) { echo «Внешний цикл.<br>»; for ($j = 0; $j < 2; $j++) { echo «Вложенный цикл.<br>»; } } ?>

Что вам делать дальше:

Приступайте к решению задач по следующей ссылке: задачи к уроку.

Когда все решите — переходите к изучению новой темы.

Конструкция goto

goto — оператор безусловного перехода. При упоминании goto и

названия метки

идёт поиск самой метки, куда нужно перейти. Сама метка ставится после оператора и имеет вид

название:

.

Синтаксис

  goto название_метки; // указываем желаемую метку
  echo ‘hello’;
  
  название_метки:  // место перехода
  echo ‘world’;
Пример goto

<?php
 $a = 0; 

  for ($a = 0; $a < 10; $a++) {
    if ($a == 5)  // если значение переменной $a равно 5
      goto end;  // то переходим к выполнению инструкций следующих за меткой   
    echo «$a»;
  }
  echo ‘после цикла — до метки’;  // инструкция не будет выполнена
   
  end:
  echo ‘После метки’;
?>
Демонстрация Скачать исходники

Спасибо за внимание и удачи в изучении php!

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: